Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.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
Java OneToMany关系孤立项不会从数据库中删除_Java_Hibernate_Jpa - Fatal编程技术网

Java OneToMany关系孤立项不会从数据库中删除

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

这个问题/错误最初发布在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.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);