Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 休眠:通过更改复合id主键的一部分插入新行?_Hibernate_Composite Id - Fatal编程技术网

Hibernate 休眠:通过更改复合id主键的一部分插入新行?

Hibernate 休眠:通过更改复合id主键的一部分插入新行?,hibernate,composite-id,Hibernate,Composite Id,我试图向数据库中插入新行,但无法让Hibernate识别必须插入的对象。我有一个赞助商表、一个课程表和一个赞助商课程表,这是两者的交叉点。赞助商课程的主键是类SponsorCoursePK的复合id,它包含两个整数:赞助商的主键和课程的主键。SponsorCoursePK实现equals()&hashcode() 我的目标是课程表的深度副本,包括其所有赞助商课程行 我首先要求Hibernate提供一个相关课程的赞助商列表 使用现有课程行 接下来,我创建一个新的Course对象并将其提交到数据库

我试图向数据库中插入新行,但无法让Hibernate识别必须插入的对象。我有一个赞助商表、一个课程表和一个赞助商课程表,这是两者的交叉点。赞助商课程的主键是类SponsorCoursePK的复合id,它包含两个整数:赞助商的主键和课程的主键。SponsorCoursePK实现equals()&hashcode()

我的目标是课程表的深度副本,包括其所有赞助商课程行

  • 我首先要求Hibernate提供一个相关课程的赞助商列表 使用现有课程行
  • 接下来,我创建一个新的Course对象并将其提交到数据库。(用于 由于遗留原因,课程对象不由Hibernate管理)
  • 接下来,我迭代Hibernate为旧课程提供的赞助商课程列表,并将赞助商课程主键中保存courseid的部分从旧courseid更改为新创建课程的id
  • 接下来,我调用saveOrUpdate尝试让Hibernate创建新行
当我查看SQL Hibernate发送时,不存在“insert”语句:Hibernate无法识别我的新对象是“脏的”,需要插入,即使我更改了主键的一部分。如果我更改了SponsorCourse的任何其他值,Hibernate会将该对象识别为脏对象并插入新行

我的另一种方法是创建全新的SponsorCourse对象并将其持久化。我感到困惑,因为对于主键不是复合主键的其他子表,它似乎可以提取一行,更改主键,然后允许Hibernate基于脏对象插入一个新行,并使用一个新主键

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

如果我认为我可以更改Hibernate获取的对象的主键,并认为它将插入新行,那么我是否期望出现错误?在这种情况下,我是否应该始终创建自己的新对象?或者,试图通过更改主键(复合id)的一部分来强制插入是唯一的问题吗


多谢各位。很明显,我对该框架还不熟悉。

我会尝试以下方法:

  • Session.execute()持久对象
  • 更改id
  • 使用Session.replicate()将其持久化
  • 祝你好运