JPA 2.0 Eclipselink OrderColumn支持

时间:2012-06-06 23:37:19

标签: jpa jpa-2.0 eclipselink

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

我想使用@OrderColumn对此集合中的条目进行排序,但看起来我只能将其应用于List,但是使用List会破坏我的独特要求。这种理解是否正确?

如果是这样,这个案例的推荐策略是什么?

谢谢,

-Noah

1 个答案:

答案 0 :(得分:1)

这类似于以下问题:

Why cannot a JPA mapping attribute be a LinkedHashset?

Set接口没有定义元素的排序,因此您的集合需要是TreeSetLinkedHashSet实现的具体实现,而不仅仅是任何旧的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}}