从EntityManager或Hibernate Session获取PersistentSet

时间:2018-01-25 14:02:01

标签: java hibernate jpa orm

Hibernate在org.hibernate.collection.internal.PersistentSet relation:

上返回@OneToMany作为Set实现
  @OneToMany(mappedBy = "group", cascade = CascadeType.PERSIST)
  private Set<Student> studentSet;

Hibernate跟踪PersitanceSet上的所有更改(如果某个实体将添加到Set,而不是将其插入数据库等)。是否可以为JPA EntityManager,org.hibernate.Session或其他方式获得的集合具有相同的功能? 例如:

entityManager.createQuery(query, Student.class)
                .setParameter("name", name)
                .getResultList();

不会收回此类收藏品。

所以我正在寻找通过自定义查询获取元素的方法,并将元素收集到Hibernates跟踪所有更改的集合中(插入添加新的瞬态实体,更新管理实体,删除从集合中删除)

1 个答案:

答案 0 :(得分:1)

在Hibernate中无法满足您的要求。

  

Hibernate跟踪PersitanceSet上的所有更改(如果某个实体将添加到Set中,而不是将其插入数据库等)。

该陈述并不准确。 Hibernate将自动将添加到集合中的实体插入到数据库中。您需要通过声明适当的级联选项(在这种情况下为CascadeType.PERSIST)来专门选择该功能。

然而,Hibernate 所做的是追踪实体之间的关联。如果集合表示多对多关联的拥有方,则对集合的更改将建立/破坏实体之间的关联。事实上,Hibernate将跟踪所有其他实体状态,而不仅仅是关联。这就是托管实体背后的想法 - 能够像使用任何其他Java对象一样使用域对象,让Hibernate关注幕后的持久性。

从查询中检索的集合不代表单个实体状态的一部分。因此,Hibernate跟踪列表的结构状态几乎没有意义。假设您在单个事务中对同一数据进行了两次查询。然后修改其中一个结果列表并保留其他结果列表。您认为在这种情况下会发生什么?

请注意,不可能&#39;,我的意思是说Hibernate不提供开箱即用的功能。但是,如果要跟踪对任意列表的更改,可以使用列表实现(请参阅例如Glazed Lists或Apache Commons Events)。您可以将它们与Hibernate API结合使用以获得所需的行为。