我想使用hibernate
创建数据库映射:每个Person
可能只有一个Address
,但可以分配相同的地址多人(例如家庭成员)。
以下映射不起作用:
@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
为什么我会遇到此异常,如何防止它发生?我认为由于级联,地址应该自动保存?
最佳答案
添加@Cascade({CascadeType.MERGE})
至private Set<Person> persons;
或从 ALL
更改至MERGE
。问题是您正在对人员进行更改,并且在保存地址之前没有保存它们。合并级联将为您完成此操作。
关于java - 如何级联持久化 @ManyToOne 关系(TransientPropertyValueException)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32068281/