Hibernate - 控制插入和更新查询

4
考虑以下关联关系 Book具有OneToMany的Chapters
如果我执行:
session.save(book)
session.save(chapter)
session.getTransaction().commit()

Hibernate 为 Book 生成插入语句,并为 Chapter 生成插入语句。但如果我执行:
session.save(chapter)
session.save(book)
session.getTransaction().commit()

Hibernate执行了章节的插入查询、书的插入查询和章节的更新查询。
有没有办法仅使用2个插入而不是2个插入和1个更新呢?(假设主键生成类似于Identity,且Chapter.Book可为空)

1
你可以展示一下你的映射以及初始化章节的代码吗?(我猜你有一个从书到章节的@OneToMany关系,但是它是双向的吗?哪一方拥有这个关联关系?你如何设置这个关联关系?是通过将章节添加到书籍中还是将书籍设置为章节的一部分?) - Thierry
1个回答

5
这是因为你可能有Book 1..n Chapter,并将cascade设置为(至少)PERSIST。这意味着每当保存一本书时,它的所有章节也会被保存。
所以实际上您尝试保存两次章节。您不需要第二次保存(在第二个例子中)。
第一个示例的工作原理是因为该章节已与会话关联(也许您还没有覆盖hashCode()equals()方法),而且save()根本不起作用。
但这些都只是猜测。您需要展示映射。

你的解释对于第一个例子不起作用:书籍被保存(如果有级联,其章节也会被保存),然后再用你的解释保存一次章节,还生成了一次更新。但这并不是发生的事情。在第二个例子中,我猜第一次保存章节时没有保存到书籍的链接。然后生成更新以设置链接(一旦Hibernate知道了书籍的ID)。 - Thierry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接