Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/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
为什么赢了';当所有者实体失去对它们的引用时,JPA是否删除所有者实体?_Jpa_Merge_One To Many - Fatal编程技术网

为什么赢了';当所有者实体失去对它们的引用时,JPA是否删除所有者实体?

为什么赢了';当所有者实体失去对它们的引用时,JPA是否删除所有者实体?,jpa,merge,one-to-many,Jpa,Merge,One To Many,我有一个JPA实体“Request”,它拥有一个答案列表(也是JPA实体)。以下是在Request.java中如何定义它: @OneToMany(cascade= CascadeType.ALL, mappedBy="request") private List<Answer> answerList; 在程序执行过程中,请求的应答列表中可能添加或删除应答,或者替换实际的列表对象。因此,我的问题是:当我将一个请求合并到数据库中时,列表中的应答对象会保留在数据库中——也就是说,请求不再

我有一个JPA实体“Request”,它拥有一个答案列表(也是JPA实体)。以下是在Request.java中如何定义它:

@OneToMany(cascade= CascadeType.ALL, mappedBy="request")
private List<Answer> answerList;
在程序执行过程中,请求的应答列表中可能添加或删除应答,或者替换实际的列表对象。因此,我的问题是:当我将一个请求合并到数据库中时,列表中的应答对象会保留在数据库中——也就是说,请求不再包含引用的应答对象(间接地,通过列表)不会被删除

这不是我想要的行为,就像我将一个请求合并到数据库中,然后再次获取它一样,它的答案列表可能不同。我是否犯了一些编程错误?是否有注释或设置可确保数据库中的答案与请求列表中的答案完全一致


解决方案是保留对原始答案列表的引用,然后在合并请求之前使用EntityManager删除每个旧答案,但似乎应该有一种更干净的方法。

在映射关系中指定其他属性是非法的。
您可以在请求中使用@DependentElement注释。

在JPA1.0中,您想做的事情不能由JPA完成。简单地说,所有关系管理都必须由应用程序完成,包括从集合中删除任何孤立项(这正是您要做的)

在JPA2.0中,它们确实支持(虽然我不知道细节),但根据您的实现,升级可能不容易或不可能

您也可以直接使用Hibernate之类的东西,但仍然使用许多JPA1.0注释等。我也不能提供这方面的详细信息


在我的例子中,我编写了通过反射自动处理集合合并的通用代码。

使用EclipseLink并将@PrivateOwned注释放入answerList会有所帮助。

如果您使用Hibernate作为JPA提供程序,您可以添加

@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)

在回答名单上。除了您已经在那里使用的JPA注释之外,这还可以工作。JPA 2(大多数/所有JPA提供程序目前都没有生产就绪的实现)可以自己完成这项工作。

在Hibernate中,可以使用CascadeType.DELETE\u ORPHAN完成这项工作。
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)