我希望我的持久性提供程序(EclipseLink 2.6.0)在连接表上发出DELETE
语句在双向@ManyToMany
的非拥有方上调用合并。< / p>
不允许(根据要求)在拥有方调用合并。
假设您有两个实体
@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<>();
}
和
@Entity
public class Person extends Subject
{
@ManyToMany(mappedBy = "personList", cascade = { CascadeType.MERGE, CascadeType.REFRESH })
private List<Account> accountList = new ArrayList<>();
}
所以,Account
拥有这种关系。
假设您已加载具有此结构的Person1
:
Person1
Account1
Person1
Person2
Account2
Person1
Person3
并且此结构映射到此连接表:
+------------+-----------+
| ACCOUNT_ID | PERSON_ID |
+------------+-----------+
| A1 | P1 |
| A1 | P2 |
| A2 | P1 |
| A2 | P3 |
+------------+-----------+
现在,使用Account1
Person1
和p1.getAccountList().remove(a1); a1.getPersonList().remove(p1);
所以,我们最终得到了这个结构:
Person1
Account2
Person1
Person3
Account1
Person2
最后,调用em.merge(p1)
和显然在连接表上没有发出SQL,因为merge不会级联到Account1
(这是拥有方),因为它不在列表中。
问题:是否有可能在非拥有方面实现删除调用合并?
我知道我可以简单地em.merge(p1); em.merge(a1);
但我不想:我问这个问题是为了找到一种通用的方式来实现&#34;虚拟& #34;使每个@ManyToMany
成为拥有者。
这将极大地简化应用程序代码,允许 REAL 关系独立方法。
第一次想到,这些在我脑海中浮现:
@Transient
列表存储已移除的对象,并在@PreUpdate
DescriptorCustomizer
拦截preUpdateWithChanges()
并在已删除的对象上级联合并@ManyToMany
以使双方都成为所有者orphanRemoval
(但仅限于连接表)存在于EclipseLink的深处建议?