休眠是否保留了LinkedHashSet的顺序,如果是,如何?

2022-09-03 02:19:07

休眠是否保留了LinkedHashSet的顺序,如果是,如何?如果这取决于数据库的类型,我想知道PostgreSQL。

背景:

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

现在,当我再次从数据库中获取“logError”对象时,它是否仍会被排序?如果是这样,我很好奇Hibernate是如何做到这一点的。


答案 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>();
}

休眠本身并不能保持顺序!

如果您看一下从数据库加载实体时使用的类,那么 is 类型为 ,它是围绕另一个的包装器,这(在我的情况下)是正常的。( 不保留其元素的顺序。ASetbSetPersistentSetSetHashSetHashSet

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

但是,您可以使用批注 () 来显式排序。例如:@Sortorg.hibernate.annotations.Sort

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

@see:在 JPA 查询中对子对象的返回进行排序


由Łukasz Rzeszotarski在2012年9月1日添加:

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

@see:sql 中的休眠排序


答案 2

集合没有固有的“顺序”,数据库表也没有 - 您可以在查询数据时应用顺序,但除非您保留该顺序(例如,通过逐个获取行并将它们放入有序容器中,如链接列表),否则返回的数据也将是无序的。


推荐