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排序
| 归档时间: |
|
| 查看次数: |
9989 次 |
| 最近记录: |