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使用List
或LinkedHashSet
,仍然不建议将实现基于自然(不保证)的数据库顺序。 对于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
示例中, position
是RuleAction
的Integer属性,因此顺序以这种方式持久化。 我猜在C#
看起来很相似。
- HIbernate无法使用外键删除实体。 外键设置为null
- Hibernate枚举映射
- 将Hibernate实体映射为未知的DiscriminatorValue for InheritanceType.SINGLE_TABLE
- 自动增量不适用于具有复合键的Entity类
- Hibernate – ClassNotFoundException:com.mysql.jdbc.Driver
- Hibernate 5.2版 – >很多Query方法都弃用了?
- hibernate composite主键包含一个复合外键,如何映射这个
- 保存具有复杂关系的实体时的StaleStateException
- 使用Set面向循环依赖时的Java序列化错误