【发布时间】:2012-09-26 07:11:55
【问题描述】:
我有这样的关系
<set name="someBeans" table="sometable" cascade="all, delete-orphan" inverse="true" lazy="true">
<key column="some_id" />
<one-to-many class="someBean" />
</set>
在我的 Java 代码中,对此执行了一组操作,就像
myClass.setSomeBeans(SomeBeans);
现在这个 SomeBeans 是一个linkedHashmap,因此订单得到了维护,但是由于在级联中使用了所有 Delete Orphan,我在特定场景中遇到了异常:
HibernateException – A collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance
所以我把上面的java实现改成了
myClass.getSomeBeans().clear();
myClass.getSomeBeans().addAll(SomeBeans)
但是这样做我无法维持来自linkedHashMap SomeBeans 的订单。
有没有人遇到过这样的问题,如果有这方面的帮助,将不胜感激
问候,
外婆
【问题讨论】:
-
Hibernate 从数据库加载集合时,不会使用 LinkedHashSet,因此顺序是任意的。为什么要在这种特殊情况下保留它?依赖 Hibernate 维护的集合中的插入顺序没有多大意义。
-
订单存储在不同的表中,因此我需要将该订单应用到 SomeBeans,然后在我的 java 代码中执行 SetSomeBeans(),该代码开始将上述异常提供给我尝试的方式clear() 然后 addAll(),hibernate 不保留顺序,因此解决方案弄乱了 SomeBeans 的顺序。
-
你还没明白。假设 Hibernate 将您的集合保持原样,并保持关联。现在您开始一个新事务,并从数据库中重新加载实体及其集合。 Hibernate 不会神奇地保留集合中 bean 的顺序。它将创建一个无序、无链接的集合,并且实体的顺序将是任意的。所以依赖实体的插入顺序是愚蠢的。
-
感谢您对此的投入,但我觉得这是一个错误的方向,我说当我使用 bean 的简单设置操作时它对我来说很好,但这让我与我尝试过 clear() 和 addAll() 的所有删除孤儿相关的异常,这弄乱了顺序。
标签: java hibernate linkedhashset all-delete-orphan