JPA从@ManyToMany删除并合并非拥有方

时间:2015-05-20 08:04:18

标签: jpa merge many-to-many eclipselink

TL; DR

我希望我的持久性提供程序(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

双方分离Person1p1.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 关系独立方法。

第一次想到,这些在我脑海中浮现:

  1. 使用@Transient列表存储已移除的对象,并在@PreUpdate
  2. 期间级联合并到它们
  3. 使用EclipseLink DescriptorCustomizer拦截preUpdateWithChanges()并在已删除的对象上级联合并
  4. 映射两个单向@ManyToMany以使双方都成为所有者
  5. 可能类似于orphanRemoval(但仅限于连接表)存在于EclipseLink的深处
  6. 建议?

0 个答案:

没有答案