【问题标题】:JPA 2.0 Eclipselink OrderColumn supportJPA 2.0 Eclipselink OrderColumn 支持
【发布时间】:2012-06-06 23:37:18
【问题描述】:

我正在阅读有关 Eclipselink 对 @OrderColumn 的支持的 docs。看起来这仅适用于 List 而不是 Set。我问的原因是因为我有一个 ManyToMany 双向关系(使用连接表),它是一个 Set 并用 HashSet 实现,因为集合不能有重复项。

我想使用@OrderColumn 对该集合中的条目进行排序,但似乎我只能将其应用于列表,但是使用列表会破坏我的独特要求。这种理解正确吗?

如果是这样,对于这种情况,推荐的策略是什么?

谢谢,

-诺亚

【问题讨论】:

    标签: jpa jpa-2.0 eclipselink


    【解决方案1】:

    这看起来类似于以下问题:

    Why cannot a JPA mapping attribute be a LinkedHashset?

    Set 接口没有定义元素的顺序,因此您的集合需要是一个具体的实现,如TreeSetLinkedHashSet 实现,而不仅仅是任何旧的Set。但是你的 JPA 提供者通常会使用它自己的集合实现和特殊的魔法来处理延迟加载。

    上述答案表明,如果您愿意放弃延迟加载,可能会有一些特定于 EclipseLink 的解决方法。

    我能想到两种选择,都不是完美的:

    • 只需使用 List 并依靠业务逻辑来强制唯一性,并使用 DB UNIQUE 约束作为后盾。老实说,我最终几乎反射性地将List 用于集合,即使Set 会更合适;我承认这很草率,但在多年的实践中还没有给我造成任何重大问题。

    • 使用Set 并将@ManyToMany 更改为@OneToMany,并使带有订单列的联接表成为使用订单列实现Comparable 的实际实体。然后,重载你的 getter 方法来做类似的事情

      if (! this.set instanceof TreeSet) 
         this.set = new TreeSet<T>(this.set); 
      return this.set;
      

    【讨论】:

    • 您好,感谢您的反馈。我最终将其更改为带有@OrderColumn 的列表,并在插入时强制执行业务逻辑的唯一性。次优,因为插入现在需要额外的 O(n) 来检查重复项。然而,这似乎是目前唯一的方法。我还在连接表的两个 FK 列的元组上留下了 unique/pk 约束。我还向 Eclipselink 提交了一个增强请求:enhancement request
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-21
    • 2011-08-24
    相关资源
    最近更新 更多