我正在阅读有关 Eclipselink 对@OrderColumn的支持的文档。看起来这仅适用于 List 而不是 Set。我问的原因是因为我有一个 ManyToMany 双向关系(使用连接表),它是一个 Set 并用 HashSet 实现,因为集合不能有重复项。
我想使用@OrderColumn 对该集合中的条目进行排序,但似乎我只能将其应用于列表,但是使用列表会打破我的独特要求。这种理解正确吗?
如果是这样,这种情况下推荐的策略是什么?
谢谢,
-诺亚
我正在阅读有关 Eclipselink 对@OrderColumn的支持的文档。看起来这仅适用于 List 而不是 Set。我问的原因是因为我有一个 ManyToMany 双向关系(使用连接表),它是一个 Set 并用 HashSet 实现,因为集合不能有重复项。
我想使用@OrderColumn 对该集合中的条目进行排序,但似乎我只能将其应用于列表,但是使用列表会打破我的独特要求。这种理解正确吗?
如果是这样,这种情况下推荐的策略是什么?
谢谢,
-诺亚
这看起来类似于以下问题:
为什么 JPA 映射属性不能是 LinkedHashset?
该Set
接口没有定义元素的顺序,因此您的集合需要是一个具体的实现,例如 a TreeSet
orLinkedHashSet
实现,而不仅仅是任何旧的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;