一对多关系休眠的麻烦



你好,我正在尝试学习一对多映射,但我真的在休眠时遇到了麻烦。我能够持久化到数据库,但是当尝试应用一对多关系时,它不会持久化到数据库,并且在邮递员中查看响应正文时也不会显示关系。从昨天早上开始,我真的需要帮助解决这个问题。我在YouTube和互联网上查看过教程,但每个教程似乎都是基本的,并且在应用相同的想法时没有成功。我有一个实体人员和另一个实体组织。一个人最多可以属于一个组织,但不同的人可以属于同一个组织。所以我的方法是使用一对多关系。

以下是我的组织实体:

@Entity
@Table(name="organization")
public class Organization {
    @Id
    @Column(name="org_Id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    private String name, description;
    @OneToMany(/*fetch = FetchType.EAGER, cascade = CascadeType.ALL*/)
    @JoinTable(joinColumns = @JoinColumn(name="org_Id"),
    inverseJoinColumns = @JoinColumn(name="person_Id"))
   // @JsonIgnore
    //@JoinColumn(name="org_Id")
    private Collection<Person> personCollection = new ArrayList<Person>();
    public Collection<Person> getPersonCollection() {
        return personCollection;
    }
    public void setPersonCollection(Collection<Person> personCollection) {
        this.personCollection = personCollection;
    }
    private Address address;
    public Organization() {}
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
}

以下是我的个人实体:@Entity

@Table(name = "Person")
public class Person {
    @Id
    @Column(name="person_Id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;
    @Column(name="Email",unique = true)
    private String email;
    @Column(name="FirstName")
    private String first_name;
    @Column(name="LastName")
    private String last_name;
    @Column(name="Description")
    private String description;
    //@Embedded
    private Address address;
    @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    @JsonIgnore
    private Organization organization;
    public Organization getOrganization() {
      return organization;
    }
    public void setOrganization(Organization organization) {
        this.organization = organization;
    }
    public Person() {}

    public Address getAddress() {
        return address;
    }
    public void setAddress(Address address) {
        this.address = address;
    }
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getFirst_name() {
        return first_name;
    }
    public void setFirst_name(String first_name) {
        this.first_name = first_name;
    }
    public String getLast_name() {
        return last_name;
    }
    public void setLast_name(String last_name) {
        this.last_name = last_name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
}

当试图创造人时。以下是我的创建方法:

public Person createPerson(String f_name, String l_name, String email, String city, String state,
                               String zipCode, String street, String description, Long id) {
        Person person = null;
        //f_name, l_name, email are required parameters if empty return null and throws an exception..
        if(f_name.isEmpty() || l_name.isEmpty() || email.isEmpty()) {
            return person;
        }
        else {
            Session session = null;
            Transaction transaction = null;
            try {
                session = sessionFactory.openSession();
                transaction = session.beginTransaction();
                person = new Person();
                person.setFirst_name(f_name);
                person.setLast_name(l_name);
                person.setEmail(email);
                person.setDescription(description);
                Address address = new Address();
                address.setStreet(street);
                address.setZipCode(zipCode);
                address.setState(state);
                address.setCity(city);
                person.setAddress(address);
/* checks to see if id of organization exist if so add to list if not don't do anything.*/
                if(id!=null) {
                    Organization organization = session.get(Organization.class, id);
                    if (organization != null) {
     /* adds id of organization to person table and vice versa.*/
                        person.setOrganization(organization);
                        organization.getPersonCollection().add(person);
                    } else {
                        //do nothing
                    }
                }
                session.save(person);
                transaction.commit();
            } catch (HibernateException ex) {
                if (transaction != null)
                    transaction.rollback();
                ex.printStackTrace();
            } finally {
                if (session != null)
                    session.close();
            }
            return person;
        }
    }

我能够创建人员和组织并保存到数据库。但是当我尝试将组织添加到数据库中的人行时,我无法添加关系(当我尝试查找数据库本身时进行了验证(,并且也没有响应,因为我也收到一个延迟的初始化收集错误。请问有人遇到过这个问题

我刚刚执行了您在休眠中给出的代码片段,具有以下简化的结构,效果非常好。您应该从这里开始并根据需要进行修改。

Entity
@Table(name="organization")
public class Organization {
    @Id
    @Column(name="org_Id")
    private long id;
    private String name, description;
    @OneToMany(cascade = CascadeType.ALL)
    private Collection<Person> personCollection = new ArrayList<Person>();
    public Collection<Person> getPersonCollection() {
        return personCollection;
    }
    public void setPersonCollection(Collection<Person> personCollection) {
        this.personCollection = personCollection;
    }

    public Organization() {}
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
}

@Entity
@Table(name = "Person")
public class Person {
    @Id
    @Column(name="person_Id")
    private long id;
    @Column(name="Email",unique = true)
    private String email;
    @Column(name="FirstName")
    private String first_name;
    @Column(name="LastName")
    private String last_name;
    @Column(name="Description")
    private String description;
    @ManyToOne()
    private Organization organization;
    public Organization getOrganization() {
      return organization;
    }
    public void setOrganization(Organization organization) {
        this.organization = organization;
    }
    public Person() {}
    public long getId() {
        return id;
    }
    public void setId(long id) {
        this.id = id;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
    public String getFirst_name() {
        return first_name;
    }
    public void setFirst_name(String first_name) {
        this.first_name = first_name;
    }
    public String getLast_name() {
        return last_name;
    }
    public void setLast_name(String last_name) {
        this.last_name = last_name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
}

编辑:关系的"人员"端的 CascadeType.ALL 已移至关系的组织端。因为您希望在删除组织时删除人员,但不是相反。

最新更新