【问题标题】:Hibernate all-delete-orphan for ordered collectionsHibernate all-delete-orphan 用于有序集合
【发布时间】: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


【解决方案1】:

为了完成我想要的,我创建了一个虚拟对象,复制了休眠对象的属性并对其应用了排序,它得到了保留,并且所有与删除孤儿相关的问题也得到了处理。

【讨论】:

    猜你喜欢
    • 2015-10-22
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 2013-09-25
    相关资源
    最近更新 更多