Java OneToMany关系孤立项不会从数据库中删除
这个问题/错误最初发布在Hibernate的JIRA上: 我的日志属性设置为:Java OneToMany关系孤立项不会从数据库中删除,java,hibernate,jpa,Java,Hibernate,Jpa,这个问题/错误最初发布在Hibernate的JIRA上: 我的日志属性设置为: logging.level.org.hibernate.SQL: TRACE logging.level.org.hibernate.event.internal: TRACE logging.level.org.hibernate.engine.spi.CollectionEntry: TRACE logging.level.org.hibernate.engine.spi: TRACE logging.level
logging.level.org.hibernate.SQL: TRACE
logging.level.org.hibernate.event.internal: TRACE
logging.level.org.hibernate.engine.spi.CollectionEntry: TRACE
logging.level.org.hibernate.engine.spi: TRACE
logging.level.org.hibernate.engine.internal: TRACE
我有两个实体:Job
和Step
作业与步骤具有一对一关系,该步骤标记为orphanRemoving=True
@OneToMany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinTable(name = "JOB_STEP")
private List<Step> steps;
我看到三条预期的日志消息:
o.h.e.i.AbstractFlushingEventListener: Flushed: 0 insertions, 0 updates, 1 deletions to 2 objects
org.hibernate.SQL: delete from job_step where job_id=?
org.hibernate.SQL: delete from step where id=?
第二种情况是,
orphanRemoving=true
不调用从数据库中删除孤立项
Job job = new Job("Test");
Step step = new Step("Test");
repository.save(job); //This causes the bug to happen
job.addStep(step);
repository.save(job);
job.removeStep(step);
repository.save(job);
执行上述代码后,我仍然可以在DB中的STEP和JOB_STEP表中看到条目
打印以下日志:刷新:0次插入,0次更新,0次删除2个对象
几周来,我一直试图通过调试Hibernate的源代码来找到这个问题的根本原因。但这并没有真正起作用。但是,我注意到一些可能对您有帮助的异常情况: 1) 在调试过程中,我在org.hibernate.engine.spi.CollectionEntry中偶然发现了这个方法,它实际上只是擦除了存储的步骤快照,之后会导致hibernate找不到孤立项。在第一种情况下,当Hibernate按预期工作时,
resetStoredSnapshot
根本不执行
2) 我注意到java.util.List的步骤一旦被hibernate转换为org.hibernate.collection.PersistentList,就会异常工作
带有复制错误的工作区位于此处:根据:
将返回的实例用于进一步的操作,因为保存操作可能会完全更改实体实例。
您应该这样做:
job = repository.save(job);
步骤
在保存后也可能不同
要记住这一点,请考虑
@Id
。保存实体时,可能会得到一个具有更新id的新对象。与子对象相同,如步骤
首先,我不知道为什么您为OnToMany
关系设置了单独的表。您可以将与jobID
的一对多关系实现为步骤
表中的一列
要正确地实现多个关系,请遵循以下步骤
现在回答你的问题:
若要删除孤立项,您需要将其父项设置为null,如果您有双向关系差不多
job.removeStep(step);
step.setJob(null);
也请看一下这个答案对于50磅的悬赏,我会看一看。基本上,您希望它为您概述的案例执行删除操作,或者解释为什么不能/没有执行删除操作?前段时间我有一个类似的问题,但从未找到根本原因。在管理实体时必须删除子项,如果您删除了持久性上下文之外的子项(例如在客户端/前端等),那么您试图用新删除的子项保存父项,子项将不会被删除。。。所以我不知道是否
job.removeStep(步骤)代码>在持久性上下文中,或者norThis不明显,我遵循的所有教程都没有真正强调这一点。谢谢
job.removeStep(step);
step.setJob(null);