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

标签 java hibernate insertion linkedhashset

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/

相关文章:

algorithm - btree 插入的一个特殊问题

java - 优化图像 - 在 Java 中无损压缩图像

java - 如果属性没有规则,Hibernate 的 validateValue() 会抛出非法参数异常?

python - 我必须在第二次迭代之前关闭 txt 吗?

java - 如果我们在 hibernate 状态下开始事务但不提交会发生什么?

java - Hibernate 连接映射

qt - QTreeView&QAbstractItemModel&insertRow

java - 从不同列使用 Excel、ArrayList 和 Java 打印简单值 如果具有值的 Number 行之间不存在匹配,则不起作用

java - 分隔符之间的正则表达式匹配

java - 为什么传递给 List 参数的 List<Integer> 上的 add(String) 不抛出异常?