Hibernate SET元素order-by子句

时间:2011-09-05 01:21:49

标签: java hibernate

我很想知道,当fetch = select时,你可以在映射文件中的SET元素上设置order-by属性,但是如果你在创建时获取所有内容查询。这样安全吗?

我的意思是,他们将结果泵入HashSet,是不是我认为那些不能保证元素顺序?

1 个答案:

答案 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不保证元素顺序。