我正在阅读docs关于 Eclipselink 对 @OrderColumn 的支持。看起来这只适用于 List 而不是 Set。我问的原因是因为我有一个 ManyToMany 双向关系(使用连接表),它是一个 Set 并使用 HashSet 实现,因为集合不能有重复项。
我想使用@OrderColumn对该集中的条目进行排序,但看来我只能将其应用于列表,但是使用列表将打破我的独特要求。这种理解正确吗?
如果是这样,针对这种情况推荐的策略是什么?
谢谢
-诺亚
最佳答案
这看起来类似于以下问题:
Why cannot a JPA mapping attribute be a LinkedHashset?
Set
接口(interface)没有定义元素的顺序,因此您的集合需要是一个具体的实现,例如 TreeSet
或 LinkedHashSet
实现,不仅仅是任何旧的Set
。但是您的 JPA 提供程序通常会使用自己的集合实现,并具有特殊的魔力来处理延迟加载。
上面的答案表明,如果您愿意放弃延迟加载,可能有一些特定于 EclipseLink 的解决方法。
我可以想到两种选择,但没有一种是完美的:
只需使用
List
并依靠业务逻辑来强制执行唯一性,并以 DB UNIQUE 约束作为后盾。老实说,我最终几乎条件反射地使用List
进行集合,即使Set
更合适;我承认这很草率,但在多年的实践中尚未给我带来任何重大问题。使用
Set
并将@ManyToMany
更改为@OneToMany
,并使带有顺序列的连接表成为实际实体使用 order 列实现Comparable
。然后,重载您的 getter 方法来执行类似的操作if (! this.set instanceof TreeSet) this.set = new TreeSet<T>(this.set); return this.set;
关于JPA 2.0 Eclipselink OrderColumn 支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10923806/