关于Eclipselink对@OrderColumn的支持,我正在阅读docs。看起来这只适用于List而不是Set。我问的原因是因为我有一个ManyToMany双向关系(使用连接表),它是一个Set并且是用HashSet实现的,因为该集合不能有重复项。
我想使用@OrderColumn对此集合中的条目进行排序,但看起来我只能将其应用于List,但是使用List会破坏我的独特要求。这种理解是否正确?
如果是这样,这个案例的推荐策略是什么?
谢谢,
-Noah
答案 0 :(得分:1)
这类似于以下问题:
Why cannot a JPA mapping attribute be a LinkedHashset?
Set
接口没有定义元素的排序,因此您的集合需要是TreeSet
或LinkedHashSet
实现的具体实现,而不仅仅是任何旧的Set
。但是你的JPA提供者通常会使用自己的集合实现来处理延迟加载。
上述答案表明,如果您愿意放弃延迟加载,可能会有一些特定于EclipseLink的解决方法。
我可以想到两个选择,都不是完美的:
只需使用List
并依靠业务逻辑来强制执行唯一性,并将DB UNIQUE约束作为后备。老实说,即使List
更合适,我最终也会使用Set
几乎反射性地使用Set
。我承认它很草率但在多年的练习中还没有给我带来任何重大问题。
使用@ManyToMany
并将@OneToMany
更改为Comparable
,并使您的联接表w / order列成为使用订单列实现if (! this.set instanceof TreeSet)
this.set = new TreeSet<T>(this.set);
return this.set;
的实际实体。然后,重载你的getter方法来做类似
{{1}}