hibernate 是否保留 LinkedHashSet 的顺序,如果保留,如何保留?如果这取决于数据库的类型,我想了解 PostgreSQL。
背景:
我知道 LinkedHashSet 是做什么用的,我问这个的原因是因为我正在将我执行的一些函数的名称记录到“logError”表中,该表与某些 '函数名称'表。 我需要这些函数保持与执行它们时相同的顺序,所以首先我找到相应的“functionName”对象,将它们放在 LinkedHashSet 中(在每个失败的函数之后),然后我保留“logError”对象。
现在,当我再次从数据库中获取 'logError' 对象时,它还会被排序吗?如果是这样,我很好奇 Hibernate 是如何做到这一点的。
最佳答案
首先:我假设您在谈论两个实体之间的关系。有点像
@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
bSet
的类型为 PersistentSet
,它是另一个 Set
的包装器,这是(在我的例子中)一个普通的 HashSet
。 (HashSet
不保留其元素的顺序。)
即使 Hibernate 使用 List
或 LinkedHashSet
,仍然不建议将实现基于自然(无法保证)的数据库顺序。对于 MySQL,它是某种反模式。
但是您可以使用 @Sort
注释 (org.hibernate.annotations.Sort
) 来明确排序。例如:
@OneToMany(mappedBy = "as")
@Sort(type = SortType.COMPARATOR, comparator = MyBComparator.class);
public SortedSet<C> cs;
@查看:Ordering return of Child objects in JPA query
由 Łukasz Rzeszotarski 于 2012 年 9 月 1 日添加:
但我们必须记住,使用 @Sort
注释会导致在内存 (jvm) 中而不是在 sql 中对对象进行排序。相反,我们可以使用 @OrderBy
注释,它会导致在 sql server 端进行排序。在我(Łukasz Rzeszotarski)看来,这两个注释都有一个弱点,即默认设置排序。我(Łukasz Rzeszotarski)宁愿 hibernate 在“看到”使用 order by 子句时使用自己的 LinkedHashSet 实现。
关于java - hibernate 是否保留 LinkedHashSet 的顺序,如果是,如何保留?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4243865/