我有一个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供应商不必在这个时候投入生产实现)可以做到这一点对自己。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top