gpt4 book ai didi

java - hibernate 是否保留 LinkedHashSet 的顺序,如果是,如何保留?

转载 作者:搜寻专家 更新时间:2023-10-30 19:43:53 27 4
gpt4 key购买 nike

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 使用 ListLinkedHashSet,仍然不建议将实现基于自然(无法保证)的数据库顺序。对于 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 实现。

@查看:Hibernate ordering in sql

关于java - hibernate 是否保留 LinkedHashSet 的顺序,如果是,如何保留?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4243865/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com