坚持大量收藏

时间:2013-12-01 02:07:30

标签: performance hibernate collections

我正在尝试尽可能有效地持久保存包含~3000个对象的集合。

以下是我在日志中获得的内容:

Hibernate: insert into Animal (name, id) values (?, ?) \
...                                                     |
Hibernate: insert into Animal (name, id) values (?, ?)  |___ 3000 times
Hibernate: insert into Animal (name, id) values (?, ?)  |
Hibernate: insert into Animal (name, id) values (?, ?) /

Hibernate: update Animal set zooId=?, pos=? where id=? \
...                                                     |
Hibernate: update Animal set zooId=?, pos=? where id=?  |___ 3000 times
Hibernate: update Animal set zooId=?, pos=? where id=?  |
Hibernate: update Animal set zooId=?, pos=? where id=? /

我怀疑这是因为Hibernate执行以下操作:

  1. 保留列表的元素(此时列表对象的主键未知)
  2. 保留列表对象
  3. 现在知道列表对象的主键。更新所有元素的拥有列表的ID。
  4. 我的理解是否正确?

    我希望在zooId中直接使用正确的posinsert。这有可能吗?

    (对于集合使用生成器类assigned,对sequence使用Animal。也尝试<bag>。除pos=?之外的相同内容不显示很明显。)

1 个答案:

答案 0 :(得分:1)

您的映射已丢失,但我猜您的收藏集缺少inverse属性。有关详细信息,请参阅:1.2.5. Bi-directional associations

一些提取物:

<bag name="animals" ...  inverse="true">
...
  

这里最重要的补充是in中的inverse =“true”属性   Event的集合映射的set元素。

     

这意味着Hibernate应该采取另一方面,   Person类,当需要找到有关链接的信息时   两者之间。一旦你看到,这将更容易理解   如何创建两个实体之间的双向链接。

换句话说,此设置将指示Hibernate

1)相信Animal有一个映射属性给持有者/所有者(动物园)
2)信任ZooId在我们的代码中正确设置(对于集合中的每个Animal)
3)允许发出完整的INSERT语句... no UPDATE

因此,确保为每个Animal设置了Save之前的Zoo属性。然后inverse将为我们完成工作