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

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 bSet = new LinkedHashSet(); } 

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 cs; 

@see: 在JPA查询中命令返回Child对象


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

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

@see: 在sql中进行Hibernate排序

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

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

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

在这个Java示例中, positionRuleAction的Integer属性,因此顺序以这种方式持久化。 我猜在C#看起来很相似。