Java 将集合与@OrderColumn组合
对于m-n关系,一般建议使用Java 将集合与@OrderColumn组合,java,hibernate,Java,Hibernate,对于m-n关系,一般建议使用Set而不是List,因为它为某些操作提供了更好的性能 我试图将其与注释@OrderColumn(name=“position”)结合起来。我使用它,所以我不需要“联接表类”。我希望Hibernate根据元素在集合中的位置设置位置值。因此,我使用了LinkedHashSet @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER) @JoinTabl
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<>();
@ManyToMany(cascade={CascadeType.PERSIST,CascadeType.MERGE},fetch=FetchType.EAGER)
@JoinTable(name=“bundle\u group\u to\u bundle”,joinColumns=@JoinColumn(name=“fk\u bundle\u group”),inverseJoinColumns=@JoinColumn(name=“fk\u bundle”))
@OrderColumn(name=“position”,null=false)
私有集bundles=新LinkedHashSet();
我不能让它工作。Hibernate在读取或写入实体时完全忽略“位置”属性。只要我将其替换为列表
它就可以正常工作
Hibernate是否支持带有Set
的@OrderColumn
注意:我尝试使用
SortedSet
而不是Set
,但这需要@Sort
(已弃用)或@OrderBy
(不能与@OrderColumn
一起使用),而在我的情况下,我不能使用这些问题。这与Java问题相比,不是一个休眠问题。Set
界面不保证任何订单()。因此,在Java中,如果需要任何排序或顺序,就不能使用普通的集合
另外,Hibernate根据字段定义创建映射,即使LinkedHashSet
保持插入顺序,框架也会使用Set
来完成他的工作。通过hibernate加载的任何实体都将使用Set
的自定义实现,即PersistentSet
@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<>();
另一方面,List
和SortedSet
接口保留顺序并允许排序
实际上,Set
在某些操作上通常比List
性能更好。但是如果您不能使用SortedSet
,您的选择就很有限。同样的问题。我很惊讶,在列表中找不到@OrderColumn必须的任何文档。。。但似乎情况就是这样。有兴趣解释一下!:)那么你在Javadoc的什么地方读到了关于订单的内容?也许你把最后一段关于不可修改集合的部分弄错了。这是一个Hibernate问题,因为Hibernate可以检测到Set
和@OrderColumn
是否一起使用,然后不使用PersistentSet
。文档中说:正如其名称所暗示的,此接口为数学集合抽象建模。
在数学中,集合是一组不同元素的集合,其中排列和顺序无关紧要[Wikipedia](.在某些方法的文档中(如set.iterator()
)也强烈暗示了这一点,因为缺少任何sort
方法,如List
)。