将Set与@OrderColumn结合使用

3
在涉及m-n关系时,一般建议使用Set而非List,因为它对于某些操作具有更好的性能。
我试图将此与注释@OrderColumn(name = "position")结合使用。我这样做是为了不需要“join table class”。我希望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完全忽略了position属性。一旦将其替换为List,它就可以正常工作。

Hibernate是否支持@OrderColumnSet

注意:我尝试使用SortedSet代替Set,但这需要@Sort(已弃用)或@OrderBy(无法与@OrderColumn一起使用),这在我的情况下无法使用。


同样的问题。我很惊讶找不到关于List在@OrderColumn中是强制性的任何文档...但似乎就是这样。很想听解释! :) - Jan Zyka
1个回答

0

这不是一个Hibernate问题,而是一个Java问题。 Set接口不保证任何顺序(Set Javadoc)。因此,在Java中,如果您想要任何排序或顺序,就不能使用普通的Set

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

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

确实,Set在某些操作上通常比List表现更好。但是,如果您无法使用SortedSet,则选择有限。


那你在 Javadoc 的哪里读到了关于顺序的东西?也许你混淆了最后一段中关于“不可修改集合”的部分。这是一个 Hibernate 的问题,因为 Hibernate 可以检测到是否同时使用了 Set@OrderColumn,然后就不会使用 PersistentSet - T3rm1
该文档指出:“正如其名称所暗示的那样,此接口模拟了数学集合抽象。” 在数学中,集合是一组不同元素的集合,排列和顺序并不重要[Wikipedia](https://en.wikipedia.org/wiki/Set_(mathematics))。 这也在某些方法的文档中强烈暗示(例如Set.iterator()),并且与List不同,缺少任何sort方法。 - Baptiste Beauvais

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接