1

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

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

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

谢谢,

-诺亚

4

1 回答 1

1

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

为什么 JPA 映射属性不能是 LinkedHashset?

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

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

我可以想到两种选择,但都不是完美的:

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

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

    if (! this.set instanceof TreeSet) 
       this.set = new TreeSet<T>(this.set); 
    return this.set;
    
于 2012-06-07T01:39:56.217 回答