一对多单向hibernate映射不保存子表

时间:2011-10-19 09:46:47

标签: hibernate annotations one-to-many

我有两个名为PersonAddress的表。这些表我用hibernate使用注释映射一对多

然后在我的父实体Person中创建一个Set<Address>来保存子类。之后,我创建了一组地址并设置为Person实体,并设置了Person自己的值。

我的问题是,当我保存时,父实体子节点不会保存在DB中。

这是我的代码:

Person.java

@Entity
@Table(name="PERSON")
public class Person {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name="personId")
    private int id;
    @Column(name="personName")
    private String name;
    @OneToMany(cascade =CascadeType.ALL,fetch = FetchType.EAGER)
    @JoinColumn(name="personId") 
    private Set <Address> addresses;

Address.java

@Entity
@Table(name = "ADDRESS")
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "addressId")
    private int id;
    @Column(name = "address")
    private String address;
    @Column(name="personId") 
    private int personid;

我的道:

   public Person addNewPerson() {
    Person per = new Person();
    per.setName("aaaa person");
    Set<Address> addressSet = new HashSet<Address>();
    for(int i = 0; i<=3;i++){
        Address ad = new Address();
        ad.setAddress("aaa "+i);
        addressSet.add(ad);

    }
     per.setAddresses(addressSet);
     getHibernateTemplate().save(per );
    }

此处有人在我的表格中添加,但地址未保存。为什么呢?

双向是可能的,但单向是我的问题

1 个答案:

答案 0 :(得分:4)

personId列被映射两次:一次是使用JoinColumn注释将外键保存到地址的人,一次是地址中的常规int

从地址中删除personId字段。如果您希望从地址访问人员ID,则将关联映射为双向OneToMany / ManyToOne关联。