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跟踪所有更改的集合中(插入添加新的瞬态实体,更新管理实体,删除从集合中删除)
答案 0 :(得分:1)
在Hibernate中无法满足您的要求。
Hibernate跟踪PersitanceSet上的所有更改(如果某个实体将添加到Set中,而不是将其插入数据库等)。
该陈述并不准确。 Hibernate将不自动将添加到集合中的实体插入到数据库中。您需要通过声明适当的级联选项(在这种情况下为CascadeType.PERSIST
)来专门选择该功能。
然而,Hibernate 所做的是追踪实体之间的关联。如果集合表示多对多关联的拥有方,则对集合的更改将建立/破坏实体之间的关联。事实上,Hibernate将跟踪所有其他实体状态,而不仅仅是关联。这就是托管实体背后的想法 - 能够像使用任何其他Java对象一样使用域对象,让Hibernate关注幕后的持久性。
从查询中检索的集合不代表单个实体状态的一部分。因此,Hibernate跟踪列表的结构状态几乎没有意义。假设您在单个事务中对同一数据进行了两次查询。然后修改其中一个结果列表并保留其他结果列表。您认为在这种情况下会发生什么?
请注意,不可能&#39;,我的意思是说Hibernate不提供开箱即用的功能。但是,如果要跟踪对任意列表的更改,可以使用列表实现(请参阅例如Glazed Lists或Apache Commons Events)。您可以将它们与Hibernate API结合使用以获得所需的行为。