如何级联持久化@ManyToOne关系(TransientPropertyValueException)?

时间:2015-08-18 09:16:40

标签: java hibernate

我想使用hibernate创建数据库映射:每个Person可能只有一个Address,但同一地址可能会分配给多个人(例如gamily成员)。

以下映射不起作用:

@Entity
public class Person {
    @ManyToOne
    @JoinColumn(name="fk_address_id", foreignKey = @ForeignKey(name="fk_addres"))
    private Address address;
}


@Entity
public class Address {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String city;
    private int zip;
    private String street;

    @OneToMany(mappedBy = "address", cascade = {CascadeType.ALL})
    private Set<Person> persons;
}


@Transactional
public void create() {
    Person person = new Person();
    Address address = new Address();
    address.setStreet("test 1");
    address.setCity("test");
    address.setZip(123);
    person.setAddress(address);
    dao.save(person);
}

结果:

org.hibernate.TransientPropertyValueException: object references an unsaved transient instance - save the transient instance before flushing : Person.address -> Address

为什么我会收到此异常,我该如何预防?我认为由于级联,地址应该自动保存?

2 个答案:

答案 0 :(得分:1)

@Cascade({CascadeType.MERGE})添加到private Set<Person> persons;或从ALL更改为MERGE。问题是您在保存地址之前对Person进行了更改而不保存它们。 Merge Cascade将为您完成此任务。

答案 1 :(得分:1)

我真的不明白尼古拉​​斯·罗宾逊给出的答案......这就是:#/ p>

人不会对地址进行级联更改...但地址确实......您必须保存地址

更改

dao.save(人);

通过

dao.save(地址);