JPA 2.0 Eclipselink OrderColumn 支持

标签 jpa jpa-2.0 eclipselink

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

我想使用@OrderColumn对该集中的条目进行排序,但看来我只能将其应用于列表,但是使用列表将打破我的独特要求。这种理解正确吗?

如果是这样,针对这种情况推荐的策略是什么?

谢谢

-诺亚

最佳答案

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

Why cannot a JPA mapping attribute be a LinkedHashset?

Set 接口(interface)没有定义元素的顺序,因此您的集合需要是一个具体的实现,例如 TreeSetLinkedHashSet 实现,不仅仅是任何旧的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/

相关文章:

java - JPA 获取太多的实体类对象,即使它不是 rqquired

jpa - 从 ManyToOne 关系中删除对象不会更新父集合

java - 与同一实体的一对多关系

java - JPA2 封装遗留数据库日期字段

jpa - 在 eclipselink 中设置隔离级别

java - 如何将 @ManyToMany 与同一个表上的两个列表一起使用

java - 如何优化或更改 hibernate 生成的 SQL 语句

hibernate - 常量作为 NamedQueries 中的参数是一个好习惯吗?

jpa - jpa错误在关系属性中使用非实体[类ch.printsoft.mailhouse.usermgr.entity.Department]作为目标实体

java - 在 Eclipse Dali 中安装/更新 EclipseLink