Hibernate - 控制插入和更新查询
Posted
技术标签:
【中文标题】Hibernate - 控制插入和更新查询【英文标题】:Hibernate - controlling Insert and Update Queries 【发布时间】:2010-04-26 13:03:00 【问题描述】:考虑以下关联 本书有 OneToMany 章节
如果我执行:
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 可以为空)
【问题讨论】:
你能展示你的映射和你初始化章节的代码吗? (我猜你有一个从一本书到另一章的@OneToMany,但它是双向的吗?哪一方是关联的所有者?你如何设置关联?通过在书中添加章节或将书设置在章节内?) 【参考方案1】:那是因为您可能有Book 1..n Chapter
,而cascade
设置为(至少)PERSIST
。这意味着每当保存一本书时,它的所有章节也会被保存。
所以你实际上是在尝试保存章节两次。您不需要第二次保存(在第二个示例中)
第一个例子是这样工作的,因为章节已经与会话相关联(也许你没有覆盖hashCode()
和equals()
方法),而save()
根本没有做任何事情。
但这些都是猜测。你必须展示你的映射。
【讨论】:
您的解释不适用于第一个示例:保存书籍(如果有级联,则保存其章节),然后应再次保存该章节与您的解释,同时生成更新.这不是正在发生的事情。在第二个例子中,我猜一章的第一次保存不保存书的链接。然后生成更新以设置链接(一旦休眠知道书的ID)。以上是关于Hibernate - 控制插入和更新查询的主要内容,如果未能解决你的问题,请参考以下文章
转: Hibernate HQL查询 插入 更新(update)实例
Hibernate HQL查询 插入 更新(update)实例
Hibernate Update 在 HSQLDB 中转换删除/插入