我想知道,我可以找到我的和平与事实,你可以设置的顺序属性上的映射文件中的set元素当fetch=select,但如果你获取一切在你创建查询的时候。这样安全吗?
我的意思是,他们将结果泵入HashSet,我不认为这些不能保证元素顺序吗?
Hibernate实际上不会将结果泵入HashSet
,它将用自己的Set
实现取代任何现有的HashSet
。
当你通过调用persist()使实例持久化时,Hibernate实际上会用Hibernate自己的Set实现实例替换HashSet。
http://docs.jboss.org/hibernate/core/3.6/reference/en-US/html/collections.html
如果您使用order-by属性,那么它将不使用HashSet
,可能会使用LinkedHashSet
代替。参考我上面引用的同一份文件:
如果您希望数据库本身对集合元素排序,请使用set、bag或map映射的order-by属性。此解决方案使用LinkedHashSet或LinkedHashMap实现,并在SQL查询中而不是在内存中执行排序。
因此Hibernate将安全地维护Set
中的项的顺序-但是在创建新对象并持久化它们时要小心。如果在新对象中使用HashSet
而不是LinkedHashSet
,那么Hibernate将以基本上随机的顺序保存您的集合,因为HashSet
不保证元素顺序。