为什么不会JPA删除拥有实体时,店主实体失去他们的参考?
-
16-09-2019 - |
题
我有一个JPA实体“请求”,拥有的答案(也JPA实体)的列表。下面是如何在其真实Request.java定义:
@OneToMany(cascade= CascadeType.ALL, mappedBy="request")
private List<Answer> answerList;
和在Answer.java:
@JoinColumn(name = "request", referencedColumnName="id")
@ManyToOne(optional = false)
private Request request;
在程序执行的过程中,答案的请求的列表可能已答案添加或从它移除,或实际的列表对象可以被替换。我的问题是这样的:当我合并请求到数据库中,使用了应答对象的是在列表保存在数据库 - 也就是回答对象请求不再持有参照(直接地,通过一个列表)不会被删除。
这是不是我的愿望,我仿佛合并请求到数据库,然后再取它的行为,它的答案列表可能不一样。我是不是做一些编程错误?是否有一个注释或设置,将确保在数据库中的答案都在请求的名单?
正是答案一个解决办法是保持引用到原来的答案列表,然后使用EntityManager合并请求之前删除的每个老回答,但似乎应该有一个更清洁的方式。
解决方案
在JPA 1.0,你想要做什么不能被JPA完成。简单地说,所有的关系管理必须由应用程序来完成,包括集合移除任何孤儿(这是你想要做什么)。
在JPA 2.0,他们的支持(虽然我不知道的细节),但根据您的实现,升级可能不容易或不可能。
您也可以使用类似Hibernate直接,但仍使用许多JPA 1.0注解等等。我不能提供任何细节。
在我的情况下,我写通用代码来处理经由反射自动合并集合。
其他提示
使用的EclipseLink,并把@PrivateOwned注释answerList会有所帮助。
这是非法以指定映射关系的附加属性。 您可以使用@DependentElement注释中请求吧。
如果您使用Hibernate作为JPA提供者,你可以添加一个
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
上answerList。这除了你使用已经存在的JPA注释的工作原理。 JPA 2(大多数/所有JPA供应商不必在这个时候投入生产实现)可以做到这一点对自己。