hibernate - 如何使用分离的子节点保存父节点

Chr*_*ris 4 orm hibernate jpa

我从UI发送一个对象.将使用对现有子项的引用来创建此对象.

这是这种关系的简单说明.

class ParentEntity {
    @Id
    Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    private ChildEntity child;
}

class ChildEntity {
    @Id
    Long id;
}



ChildEntity child = new ChildEntity();
child.setId(1);
//parentEntity is created based on data sent from UI
parentEntity.setChild(child);
Run Code Online (Sandbox Code Playgroud)

当我保存这个对象时,Hibernate给了我"org.hibernate.TransientPropertyValueException:object引用一个未保存的瞬态实例".

我不需要拯救孩子,因为我根本不会改变孩子.只需要在父表的表中保存孩子的id.

我试过使用很少的CascadeType,但没有一个工作.

Dra*_*vic 7

只需为孩子使用代理:

parentEntity.setChild(entityManager.getReference(ChildEntity.class, childId));
Run Code Online (Sandbox Code Playgroud)

这里的要点是使用EntityManager.getReference:

获取一个实例,其状态可能会被懒惰地取出.

Hibernate将创建仅包含id的代理而无需转到数据库.