java - 坚持后如何填充完整的实体?

标签 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;

    // ...
}

当我保留一个新的父实体时,将执行一个数据库触发器。此触发器按默认值插入一些子项。但是坚持之后, children 不在集合中。 我该如何解决这个问题?这是我的 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;
}

非常感谢您所做的一切。

最佳答案

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

如果我正确地找到你,

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

当你做的时候

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

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

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

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

关于java - 坚持后如何填充完整的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34249324/

相关文章:

java - Java 的艺术与科学第 4 章,练习 8

java - 如何在同时安装32位和64位JVM的情况下使用32位JVM强制运行Jar文件?

postgresql - Laravel 5.3 Eloquent 事务和外键限制

sql - 查询包含 JSON 对象数组的 jsonb 列

java - Hibernate Fetch Join 仍在触发选择

sql - 在间隔桶中分配时间

java - 由于时区偏移转换,如何处理 jodatime 非法瞬间

java - ssj-2.5.jar 库上线程 "main"java.lang.NoClassDefFoundError 中出现异常

java - hibernate : Foreign key constraint violation problem

java - Spring Data Hibernate + 可分页 : Returns empty results