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

Fin*_*005 14 java hibernate linkedhashset insertion

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

背景:

我知道LinkedHashSet的用途是什么,我问这个的原因是因为我将我执行的一些函数的名称记录到'logError'表中,该表与某些'functionName'表有多对多的关系.我需要这些函数保持与执行它们时的顺序相同,所以首先我找到相应的'functionName'对象,将它们放在LinkedHashSet中(在每个失败的函数之后),然后我坚持'logError'对象.

现在当我再次从数据库中获取'logError'对象时,它仍然会被订购吗?如果是这样,我很好奇Hibernate如何做到这一点.

Ral*_*lph 13

第一:我假设你在谈论两个实体之间的关系.就像是

@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>();
}
Run Code Online (Sandbox Code Playgroud)

Hibernate本身不保留订单!

如果你看看A从数据库加载实体时使用的类,那么Set bSet是类型PersistentSet,它是另一个的包装器Set,这是(在我的例子中)正常HashSet.(HashSet不保留其元素的顺序.)

即使使用Hibernate,List或者LinkedHashSet仍然不建议将实现基于自然(不保证)的数据库顺序.对于MySQL来说,它是某种反模式.

但是您可以使用@Sortannotation(org.hibernate.annotations.Sort)来明确排序.例如:

@OneToMany(mappedBy = "as")
@Sort(type = SortType.COMPARATOR, comparator = MyBComparator.class);
public SortedSet<C> cs;
Run Code Online (Sandbox Code Playgroud)

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


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

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

@see:在sql中进行Hibernate排序

  • @ŁukaszRzeszotarski:如果你以这种方式再次编辑某人,那么至少要明确这是你的陈述,而不是原作者! (3认同)