gpt4 book ai didi

java - 保存双向 ManyToMany

转载 作者:搜寻专家 更新时间:2023-10-30 21:20:20 25 4
gpt4 key购买 nike

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

@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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com