JPA从@ManyToMany删除并合并非拥有方 TL;博士
我希望我的持久性提供程序EclipseLink 2.6.0在双向@ManyToMany的非拥有端调用merge的联接表上发出DELETE语句 需求不允许在拥有方调用merge 假设有两个实体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
@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