0

我正在尝试将新行插入数据库,但未能让 Hibernate 识别必须插入我的对象。我有一个 Sponsor 表、一个 Course 表和一个 SponsorCourse 表,它是两者的交集。SponsorCourse 的主键是 SponsorCoursePK 类的复合 ID,它包含两个整数:Sponsor 的主键和 Course 的主键。SponsorCoursePK 实现 equals() 和 hashcode()。

我的目标是创建 Course 表的深层副本,包括其所有 SponsorCourse 行。

  • 我首先向 Hibernate 询问与现有 Course 行关联的 SponsorCourses 列表。
  • 接下来我创建一个新的 Course 对象并将其提交到数据库。(由于遗留原因,Course 对象不由 Hibernate 管理)。
  • 接下来,我遍历 Hibernate 为旧课程提供给我的 SponsorCourses 列表,并将保存课程 ID 的 SponsorCourse 主键部分从旧课程 ID 更改为新创建课程的 ID。
  • 接下来我调用 saveOrUpdate 来尝试让 Hibernate 创建新行。

当我查看 SQL Hibernate 发送时,不存在“插入”语句:即使我更改了主键的一部分,Hibernate 也无法识别我的新对象是“脏的”并且需要插入。如果我更改 SponsorCourse 的任何其他值,Hibernate 会将该对象识别为脏对象并插入一个新行。

我的替代方法是创建全新的 SponsorCourse 对象并将其持久化。我很困惑,因为对于主键不是复合主键的其他子表,它似乎可以获取一行,更改主键,然后允许 Hibernate 基于脏对象插入一个新行首要的关键。

Hibernate 文档,特别是 Hibernate 3.0 参考的第 8.4 章(复合 id)和第 10 章(讨论对象的修改)不足以帮助我理解。

通过认为我可以更改 Hibernate 获取的对象的主键并认为它会插入新行,我是否期待出现错误?在这种情况下,我是否应该始终创建自己的新对象?或者,尝试通过更改作为复合 ID 的主键的一部分来强制插入是否是一个独特的问题?

谢谢你。可能很明显,我是这个框架的新手。

4

1 回答 1

0

I would try the following:

  1. Session.evict() the persistent object
  2. Changing the id
  3. Persist it using Session.replicate()

http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Session.html

Good luck

于 2011-07-14T17:00:17.317 回答