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

标签 java hibernate

我想使用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/

相关文章:

java - 私有(private) REST API 成熟度级别和额外的复杂性层

java - 我的程序中最多可以包含多少个类?

java - 在 WHERE 子句中带有集合的 HQL

java - Spring+hibernate 创建在类路径资源 [applicationContext.xml] 中定义的名称为 'dataSource' 的 bean 时出错

java - org.xml.sax.SAXParseException;文档根元素 "session-factory",必须与 DOCTYPE 根 "hibernate-configuration"匹配

java - Java 扫描器的问题

java - 如何将 Guava 添加到 Eclipse 项目

java - Spring Web服务删除响应字符串中的多个空格

hibernate - Micronaut 数据 - 没有 [org.hibernate.SessionFactory] ​​类型的 bean

java - 如何让 Hibernate Validator 在第一个字段违规时停止验证?