我正在尝试尽可能有效地持久保存包含~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执行以下操作:
我的理解是否正确?
我希望在zooId
中直接使用正确的pos
和insert
。这有可能吗?
(对于集合使用生成器类assigned
,对sequence
使用Animal
。也尝试<bag>
。除pos=?
之外的相同内容不显示很明显。)
答案 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
将为我们完成工作