gpt4 book ai didi

java - 从 EntityManager 或 Hibernate Session 获取 PersistentSet

转载 作者:行者123 更新时间:2023-12-02 11:42:34 25 4
gpt4 key购买 nike

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();

不返回此类集合。

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

最佳答案

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

Hibernate tracks all changes on PersitanceSet (if some entity will is added to Set than it will be inserted into a database and etc.)

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

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

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

请注意,“不可能”是指 Hibernate 不提供这样的现成功能。但是,如果您想跟踪对任意列表的更改,则有一些列表实现可以实现这一点(例如,请参阅 Glazed Lists 或 Apache Commons Events)。您可以将它们与 Hibernate API 结合起来以获得您想要的行为。

关于java - 从 EntityManager 或 Hibernate Session 获取 PersistentSet,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48444725/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com