Hibernate多值关联最佳实践

时间:2017-05-02 09:05:24

标签: java list hibernate set hibernate-mapping

有关stackoverflow的许多问题都涉及在Hibernate实体中使用List vs Set。我的问题略有不同(或者可能相同,但我还无法理解)。

如果我阅读了Hibernate文档,他们建议Set使用Quoting from above documentation link: You have to override the equals() and hashCode() methods if you: - intend to put instances of persistent classes in a Set (the recommended way to represent many-valued associations); - and intend to use reattachment of detached instances 进行多值关联http://docs.jboss.org/hibernate/orm/4.3/manual/en-US/html_single/#persistent-classes-equalshashcode

Set

直到Hibernate 4.3。但在以后的版本中,我再也看不到这句话了(http://docs.jboss.org/hibernate/orm/5.2/userguide/html_single/Hibernate_User_Guide.html#mapping-model-pojo-equalshashcode

所以我的问题是

  • 为什么Hibernate建议在Hibernate 4之前使用List代替String.getBytes()
  • 由于我在Hibernate 5中没有看到这个建议,这是否意味着它不再有效了?

谢谢!

1 个答案:

答案 0 :(得分:1)

很好地回答你的第一个问题:

  

为什么Hibernate建议使用Set而不是List直到Hibernate 4?

首先,我将指出ListSet之间的主要区别:

  • List是有序集合,而Set则不是,但请注意,虽然List是有序集合,但如果未指定索引列,则不会对其进行排序你的对象。
  • SetList期间不允许重复。

第二点是解释在Set上使用List的建议,即使是Hibernate documentation itself says that lists and bags are more efficient than sets

事实上,在双向关系中使用List的问题是,在合并操作时在父关联上调用它会插入重复的子项,这似乎是{{3您可以在以下网址上阅读有关此问题的更多信息:

a bug in older Hibernate versions

回答你的第二个问题:

  

由于我在Hibernate 5中没有看到这个建议,这是否意味着它不再有效了?

我们无法对此进行演绎,但我认为Hibernate 5修正了这个错误,这就是为什么我们不再看到这个推荐,但它只是一个假设