【发布时间】:2011-11-10 07:36:15
【问题描述】:
我想知道,当 fetch=select 时,您可以在映射文件中的 SET 元素上设置 order-by 属性,但如果您在创建询问。这会安全吗?
我的意思是,他们将结果泵入一个 HashSet,我不认为那些不能保证元素顺序吗?
【问题讨论】:
我想知道,当 fetch=select 时,您可以在映射文件中的 SET 元素上设置 order-by 属性,但如果您在创建询问。这会安全吗?
我的意思是,他们将结果泵入一个 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 不保证元素顺序。
【讨论】: