保存双向ManyToMany

Kim*_*m L 11 java jpa

我有两个以下列方式注释的实体类

@Entity
class A {
   @ManyToMany(mappedBy="A", cascade=CascadeType.ALL)
   private List<B> b;
 ..
}

@Entity
class B {
   @ManyToMany(cascade=CascadeType.ALL)
   private List<A> a;
 ..
}
Run Code Online (Sandbox Code Playgroud)

如果我存储类'B'的实例,则关系存储在数据库中,类'A'中的getter将返回B的正确子集.但是,如果我更改"A"中的B列表,更改不会存储在数据库中?

我的问题是,我怎样才能使这两个类中的变化"级联"到另一个类?

编辑:我尝试了删除mappedBy参数和定义JoinTable(和列)的不同变体,但我一直无法找到正确的组合.

Lou*_*met 16

最短的答案似乎是你不能,这是有道理的.在双向多对多关联中,一方必须是主方,并且用于持久更改底层连接表.由于JPA不会维护关联的两端,因此最终可能会出现一旦存储在数据库中后无法重新加载的内存情况.例:

A a1 = new A();
A a2 = new A();
B b = new B();
a1.getB().add(b);
b.getA().add(a2);
Run Code Online (Sandbox Code Playgroud)

如果可以保持此状态,则最终会在连接表中显示以下条目:

a1_id, b_id
a2_id, b_id
Run Code Online (Sandbox Code Playgroud)

但在加载时,JPA如何知道你打算只让b知道a2而不是a1?那个不应该知道b的a2怎么样?

这就是为什么你必须自己维护双向关联(并使上面的例子无法达到,即使在内存中),JPA只会根据它的一面的状态而持久化.