java - 将 Set 与 @OrderColumn 组合

标签 java hibernate

关于 m-n 关系的一般建议是使用 Set 而不是 List,因为它为某些操作提供了更好的性能。

我试图将它与注释 @OrderColumn(name = "position") 结合起来。我使用它所以我不需要“连接表类”。我想让Hibernate根据元素在集合中的位置来设置位置值。因此我使用了 LinkedHashSet

@ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER)
@JoinTable(name = "bundle_group_to_bundle", joinColumns = @JoinColumn(name = "fk_bundle_group"), inverseJoinColumns = @JoinColumn(name = "fk_bundle"))
@OrderColumn(name = "position", nullable = false)
private Set<Bundle> bundles = new LinkedHashSet<>();

我无法让它工作。 Hibernate 在读取或写入实体时完全忽略位置属性。只要我用 List 替换它,它就可以正常工作。

Hibernate 是否支持 @OrderColumnSet

注意:我尝试使用 SortedSet 而不是 Set 但这需要 @Sort(已弃用)或 @OrderBy(不能与 @OrderColumn 一起使用),我不能在我的情况下使用它。

最佳答案

这与其说是 Hibernate 问题不如说是 Java 问题。 Set 接口(interface)不保证任何顺序 ( Set Javadoc )。所以在 Java 中,如果您想要任何类型的排序或顺序,您不能使用普通的 Set

另外,Hibernate 从字段的定义创建他的映射,即使 LinkedHashSet 保持插入顺序,框架将使用 Set 来完成他的工作。任何通过 hibernate 加载的实体都将使用 Set 的自定义实现,即 PersistentSet

另一方面,ListSortedSet 接口(interface)保留顺序并允许排序。

确实,Set 在某些操作上通常比 List 表现更好。但是,如果您不能使用 SortedSet,那么您的选择就很有限。

关于java - 将 Set 与 @OrderColumn 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64210246/

相关文章:

java - CamelContext.getRoutes() 返回 size =0 直到上下文启动

java - Spring Hibernate 在测试中保存实体不持久

java - 从端点调用时,Spring Boot 获取 UTC+1 而不是 GMT

java - 连接到两个数据库时出现 LazyInitializationException

java - 您如何对动态语言进行更改,并找到所有将被该更改破坏的地方?

java - 如何避免在 Spring Boot 集成测试中使用拦截器

java - 为什么只在进行防御性副本后才检查有效性?

java - 使用 Eclipse 在 Java 资源包中搜索包含非 ASCII 字符的单词

java - Hibernate 字节码增强单向 ManyToOne

java - hibernate 查询 : positioned parameter and named parameter