一尘不染

休眠状态是否保留LinkedHashSet的顺序?如果是,则如何?

hibernate

hibernate状态是否保留LinkedHashSet的顺序?如果是,则如何?如果这取决于数据库的类型,那么我想对PostgreSQL有所了解。

背景:

我知道LinkedHashSet的用途是什么,我之所以问这个原因是因为我正在将执行的某些函数的名称记录到与某些“
functionName”表具有多对多关系的“ logError”表中。我需要这些函数保持与执行它们时相同的顺序,因此首先找到对应的“
functionName”对象,将它们放入LinkedHashSet中(在每个函数失败之后),然后持久保存“ logError”对象。

现在,当我再次从数据库中获取“ logError”对象时,是否仍然可以订购它?如果是这样,我很好奇Hibernate是如何做到的。


阅读 284

收藏
2020-06-20

共1个答案

一尘不染

首先:我假设您正在谈论两个实体之间的关系。就像是

@Entity
public class A {
@ManyToMany
    @JoinTable(name = "A_B", joinColumns = { @JoinColumn(name = "A_fk") }, inverseJoinColumns = { @JoinColumn(name = "B_fk") })
    private Set<B> bSet = new LinkedHashSet<B>();
}

Hibernate不会自行保留命令!

如果您查看A从数据库中加载实体时使用的类,那么Set``bSetis类型是PersistentSet,是另一个的包装Set,在我的情况下,这是正常的HashSet。(HashSet不保留其元素的顺序。)

即使Hibernate使用ListLinkedHashSet,仍然不建议将实现基于自然的(不保证的)数据库顺序。对于MySQL,这是某种反模式。

但是,您可以使用@Sort注释(org.hibernate.annotations.Sort)来使排序明确。例如:

@OneToMany(mappedBy = "as")
@Sort(type = SortType.COMPARATOR, comparator = MyBComparator.class);
public SortedSet<C> cs;

ŁukaszRzeszotarski在2012年9月1日添加:

_但是我们必须记住,使用@Sort注释会导致对内存(jvm)中的对象而不是sql中的对象进行排序。相反,我们可以使用@OrderBy注释来在sql服务器端进行排序。我(ŁukaszRzeszotarski)认为这两个注释都有一个弱点,即默认情况下设置了排序。我(ŁukaszRzeszotarski)宁愿当“看到”使用order
by子句时,hibernate使用自己的LinkedHashSet实现。

2020-06-20