【问题标题】:Trouble with one to many relationship hibernate一对多关系休眠的麻烦
【发布时间】:2015-11-09 02:37:36
【问题描述】:

您好,我正在尝试学习一对多映射,但我确实遇到了休眠问题。我能够持久化到数据库,但是当尝试应用一对多关系时,它不会持久化到数据库,并且在查看邮递员的响应正文时也不会显示关系。从昨天早上开始,我真的需要帮助来解决这个问题。我看过 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;
    }
}

下面是我的 Person 实体:@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;
        }
    }

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

【问题讨论】:

  • 您确定您发送的组织 ID 不是 null 吗?
  • 您可以删除组织中的 JoinTable 并执行此操作 @JoinColumn(name="person_Id") 并暂时使 fetch = FetchType.EAGER 以便延迟加载错误消失并检查。

标签: java spring hibernate spring-mvc


【解决方案1】:

我刚刚使用以下简化结构执行了您在休眠中提供的代码 sn-p,它工作得很好。您应该从这里开始并根据您的需要进行修改。

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;
    }
}

编辑:关系的 Person 端的 CascadeType.ALL 已移至关系的 Organization 端。因为您希望在删除组织时 Person 也应该被删除,但不是相反。

【讨论】:

  • 当我尝试你的方法时,我注意到当我将一个人添加到集合中而不是为组织保留相同的 id 时,当我对 personCollection 进行更新时它会增加
  • 您使用什么注释来生成 id ?
  • 我想我知道为什么会这样,从关系的 Person 端删除 CascadeType.ALL 并将其放在关系的 Organization 端。删除组织时你想要的 Bcoz Person 也应该被删除,但不是相反。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多