如何在坚持后填写整个实体?

时间:2015-12-13 08:34:35

标签: java hibernate postgresql jpa

我正在使用Hibernate持久性API。我有两个实体,您可以检查这些实体的父级:(子实体不包含对父级的任何引用 - 因为逻辑上不需要业务。)

@Entity(...)
public class ParentEntity implements Serializable {
    @Id
    private Integer id;

    // ...

    @OneToMany(fetch = FetchType.LAZY)
    @org.hibernate.annotations.Cascade({ org.hibernate.annotations.CascadeType.ALL }) // losing JPA's portability
    @JoinColumn(name = "parent_id", referencedColumnName = "id")
    private Set<ChildEntity> children;

    // ...
}

当我持久保存新的Parent实体时,会执行DB触发器。此触发器按默认值插入一些子项。但经过坚持,孩子们不在收藏中。 我该如何解决这个问题?这是我的Dao方法:

@Transactional(readOnly = false)
@Override
public Parent addParent(String name) {
    Parent temp = new Parent(name);
    entityManager.persist(temp);

    return entityManager.find(Parent.class, temp.getId()); // return temp;
}

非常感谢你们所做的一切。

1 个答案:

答案 0 :(得分:0)

Parent temp = new Parent(name);
entityManager.persist(temp);

如果我能帮到你,

您正在创建一个新的父对象(没有任何子实体)并将其持久化。 因此,没有任何子项的父对象将保留在DB中。

当你这样做时

entityManager.find(Parent.class, temp.getId());

您不能期望拥有包含子实体的父类。

由于您通过db触发器持久保存子对象,因此必须有一些方法来放置parent_id( tem.getId() / parent.getId())在他们中

没有其他方法可以找到持久父级的子对象。