【问题标题】:Get PersistentSet from EntityManager or Hibernate Session从 EntityManager 或 Hibernate Session 获取 PersistentSet
【发布时间】:2018-01-25 14:02:01
【问题描述】:

Hibernate 返回 org.hibernate.collection.internal.PersistentSet 作为 @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 跟踪所有更改的集合的方法(在添加新的临时实体时插入,在更改托管实体时更新,在从集合中删除时删除)

【问题讨论】:

  • 你的意图是什么? getResultList() 返回一个列表,它可以是供应商特定的实现。就像 Hibernate 中的 PersistentList 一样,它实现了您提到的行为。
  • @GeorgHenkel,我正在寻找通过自定义查询获取元素并将元素收集到 Hibernates 跟踪所有更改的集合的方法(在添加新的临时实体时插入,在更改托管实体时更新,在删除时删除来自集合)
  • EntityManager 返回一个包含托管实体的列表。只要您处于活动事务中,就会跟踪对它们的所有更改(写回数据库)。

标签: java hibernate jpa orm


【解决方案1】:

您所要求的在 Hibernate 中是不可能的。

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

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

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

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

请注意,“不可能”是指 Hibernate 不提供开箱即用的此类功能。但是,如果您想跟踪对任意列表的更改,可以使用列表实现(参见例如 Glazed Lists 或 Apache Commons Events)。您可以将它们与 Hibernate API 结合起来以获得您想要的行为。

【讨论】:

    猜你喜欢
    • 2011-05-19
    • 1970-01-01
    • 2014-10-05
    • 2013-05-16
    • 1970-01-01
    • 1970-01-01
    • 2014-09-27
    • 2016-08-22
    • 2011-11-05
    相关资源
    最近更新 更多