Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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从@ManyToMany删除并合并非拥有方 TL;博士_Jpa_Merge_Many To Many_Eclipselink - Fatal编程技术网

JPA从@ManyToMany删除并合并非拥有方 TL;博士

JPA从@ManyToMany删除并合并非拥有方 TL;博士,jpa,merge,many-to-many,eclipselink,Jpa,Merge,Many To Many,Eclipselink,我希望我的持久性提供程序EclipseLink 2.6.0在双向@ManyToMany的非拥有端调用merge的联接表上发出DELETE语句 需求不允许在拥有方调用merge 假设有两个实体 @Entity public class Account extends AbstractEntity { @ManyToMany(cascade = { CascadeType.MERGE, CascadeType.REFRESH }) @JoinTable(name = "ACCOUNT

我希望我的持久性提供程序EclipseLink 2.6.0在双向@ManyToMany的非拥有端调用merge的联接表上发出DELETE语句

需求不允许在拥有方调用merge

假设有两个实体

@Entity
public class Account extends AbstractEntity
{
    @ManyToMany(cascade = { CascadeType.MERGE, CascadeType.REFRESH })
    @JoinTable(name = "ACCOUNT_PERSON", joinColumns = @JoinColumn(name = "ACCOUNT_ID"), inverseJoinColumns = @JoinColumn(name = "PERSON_ID"))
    private List<Person> personList = new ArrayList<>();
}
此结构映射到此联接表:

+------------+-----------+
| ACCOUNT_ID | PERSON_ID |
+------------+-----------+
|         A1 |        P1 |
|         A1 |        P2 |
|         A2 |        P1 |
|         A2 |        P3 |
+------------+-----------+
现在,使用p1.getAccountList.removea1分离两侧的Account1和Person1;a1.getPersonList.removep1

因此,我们最终得到了这个结构:

Person1
    Account1
        Person1
        Person2

    Account2
        Person1
        Person3
Person1
    Account2
        Person1
        Person3

Account1
    Person2
最后,调用em.mergep1,显然不会在联接表上发出SQL,因为merge不会级联到拥有方Account1,因为它不再在列表中

问题是:是否有可能在非拥有方实现调用合并的删除

我知道我可以简单地把它们合并;em.a1;但我不想:我问这个问题是为了找到一个通用的方法,让每一个@ManyToMany成为拥有方

这将极大地简化应用程序代码,允许真正的独立于关系的方法

一想到这里,我就想到:

使用@Transient列表存储删除的对象,并在@PreUpdate期间级联合并到它们 使用EclipseLink DescriptorUserMizer截取preUpdateWithChanges并对删除的对象进行级联合并 将两个单向@ManyToMany映射为两侧都是所有者 可能与删除类似,但在联接表上只存在于EclipseLink的深处 建议

Person1
    Account2
        Person1
        Person3

Account1
    Person2