我很想知道,当fetch = select时,你可以在映射文件中的SET元素上设置order-by属性,但是如果你在创建时获取所有内容查询。这样安全吗?
我的意思是,他们将结果泵入HashSet,是不是我认为那些不能保证元素顺序?
答案 0 :(得分:4)
Hibernate实际上并没有将结果输入HashSet
,它会将任何现有的HashSet
替换为Set
的实现。
当你通过调用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 mappings的order-by属性。此解决方案使用LinkedHashSet或LinkedHashMap实现,并在SQL查询中执行排序,而不是在内存中执行。
因此,Hibernate将安全地维护Set
中项目的顺序 - 但是在创建新对象并保留它们时要小心。如果您在新对象中使用HashSet
而不是LinkedHashSet
,那么Hibernate将以基本随机的顺序保留您的集合,因为HashSet
不保证元素顺序。