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

背景:

我知道 LinkedHashSet 的用途,我问这个的原因是因为我将执行的某些函数的名称记录到“logError”表中,该表与某些“functionName”表具有多对多关系。我需要这些函数保持与执行它们时相同的顺序,因此首先我找到相应的“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;

@看: JPA 查询中子对象的排序返回


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

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

@看: Hibernate 在 sql 中的排序

其他提示

设定不具有内在的“秩序”,也不数据库表 - 当你查询的数据,你可以申请一个订单,但除非你保留这个顺序(如通过获取行逐一将它们放入一个有序的容器像链接列表),然后返回的数据也将被无序的。

当我需要坚持的项目的列表的顺序,我使用Map而不是List

@OneToMany(fetch = FetchType.EAGER, mappedBy = "rule", cascade = CascadeType.ALL)
@MapKey(name = "position")
private Map<Integer, RuleAction>    actions             = LazyMap.decorate(new LinkedHashMap<>(), FactoryUtils.instantiateFactory(RuleAction.class, new Class[] { Rule.class }, new Object[] { this }));

在本Java例子,positionRuleAction的整数属性,以便顺序被持久的方式。我想在这C#会显得颇为相似。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top