2012-06-06 68 views
1

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

我想使用@OrderColumn命令这个集合中的条目,但是它似乎只能应用于List,但是使用List会破坏我的独特要求。这种理解是否正确?

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

感谢,

-Noah

回答

1

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

Why cannot a JPA mapping attribute be a LinkedHashset?

Set接口没有定义元素的排序,所以你的设定必须是一个具体实现如TreeSetLinkedHashSet实现,不只是任何旧的Set。但是你的JPA提供者通常会使用自己的具有特殊魔力的集合实现来处理延迟加载。

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

我能想到的两种选择,没有一个完美的:

  • 只使用一个List和依靠业务逻辑强制唯一性,与DB UNIQUE约束作为一个逆止器。说实话,我最终几乎自反地使用List作为收藏,即使Set本来更合适;我承认这是sl but不驯的,但在多年的练习中仍然没有给我带来任何重大问题。

  • 使用Set,改变@ManyToMany@OneToMany,让你的连接表W /顺序列,使用顺序列实行Comparable一个实际的实体。然后,超载getter方法做这样的事情

    if (! this.set instanceof TreeSet) 
        this.set = new TreeSet<T>(this.set); 
    return this.set; 
    
+0

您好,感谢您的反馈意见。我最终将其更改为List w/@ OrderColumn,并在插入时强制业务逻辑中的唯一性。 Sub插入后的最优化需要额外的O(n)来检查重复项。但是,这似乎是目前唯一的方法。我还在连接表的两个FK列的元组中留下了唯一/ pk约束。我还通过Eclipselink提交了一个增强请求:[增强请求](https://bugs.eclipse.org/bugs/show_bug.cgi?id=382072) – NBW