我想使用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
为什么我会收到此异常,我该如何预防?我认为由于级联,地址应该自动保存?
答案 0 :(得分:1)
将@Cascade({CascadeType.MERGE})
添加到private Set<Person> persons;
或从ALL
更改为MERGE
。问题是您在保存地址之前对Person进行了更改而不保存它们。 Merge Cascade将为您完成此任务。
答案 1 :(得分:1)
我真的不明白尼古拉斯·罗宾逊给出的答案......这就是:#/ p>
人不会对地址进行级联更改...但地址确实......您必须保存地址
更改
dao.save(人);
通过
dao.save(地址);