关于 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 是否支持 @OrderColumn
和 Set
?
注意:我尝试使用 SortedSet
而不是 Set
但这需要 @Sort
(已弃用)或 @OrderBy
(不能与 @OrderColumn
一起使用),我不能在我的情况下使用它。
最佳答案
这与其说是 Hibernate 问题不如说是 Java 问题。 Set
接口(interface)不保证任何顺序 ( Set Javadoc )。所以在 Java 中,如果您想要任何类型的排序或顺序,您不能使用普通的 Set
。
另外,Hibernate 从字段的定义创建他的映射,即使 LinkedHashSet
保持插入顺序,框架将使用 Set
来完成他的工作。任何通过 hibernate 加载的实体都将使用 Set
的自定义实现,即 PersistentSet
。
另一方面,List
和 SortedSet
接口(interface)保留顺序并允许排序。
确实,Set
在某些操作上通常比 List
表现更好。但是,如果您不能使用 SortedSet
,那么您的选择就很有限。
关于java - 将 Set 与 @OrderColumn 组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64210246/