java - 保存双向 ManyToMany

标签 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;
 ..
}

如果我存储类“B”的实例,则关系存储在数据库中,类“A”中的 getter 将返回 B 的正确子集。但是,如果我对“A”中的 B 列表进行更改,这些更改不会存储在数据库中吗?

我的问题是,我怎样才能使任一类中的更改“级联”到另一个类?

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

最佳答案

最简短的答案似乎是你不能,但这是有道理的。在双向多对多关联中,一侧必须是主控方,用于保持对基础连接表的更改。由于 JPA 不会维护关联的双方,因此您最终可能会遇到一旦存储在数据库中就无法重新加载的内存情况。 示例:

A a1 = new A();
A a2 = new A();
B b = new B();
a1.getB().add(b);
b.getA().add(a2);

如果这种状态可以持续存在,您最终会在连接表中得到以下条目:

a1_id, b_id
a2_id, b_id

但是在加载时,JPA 怎么知道您打算只让 b 知道 a2 而不是 a1 呢?那不应该知道 b 的 a2 呢?

这就是为什么您必须自己维护双向关联(并使上面的示例无法访问,即使在内存中也是如此)并且 JPA 只会根据其一侧的状态持续存在。

关于java - 保存双向 ManyToMany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/824600/

相关文章:

java - 解释 Java *客户端* 安全问题和 *服务器* 安全问题之间的区别

java - 如何使用 SAAJ API 创建 SOAP 请求

java - JPA JPQL 是从数据库还是从持久性上下文中选择查询读取?

java - 命名查询和继承

java - 为继承字段添加 Java 注解

java - 将自定义标识符分配给 @id 属性

java - Eclipse - 在 java 项目中创建 2 个独立的源文件夹

java - 如何向现有方法添加新参数,同时保持向后兼容性

java - 抑制 "Picked up _JAVA_OPTIONS"消息

hibernate - RESTORE_VIEW 中的 LazyInitializationException(PersistentSet 实例化不正确)