java - 从两侧更新双向 ManyToMany

标签 java jpa many-to-many bidirectional

引用问题Saving bidirectional ManyToMany我想准确地获得被接受的答案解释为不正确的内容:

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

If this state could be persisted, you would end up with the following entries in the join table:

a1_id, b_id
a2_id, b_id

But upon loading, how would JPA know that you intended to only let b know about a2 and not a1 ? and what about a2 that should not know about b ?

在我的例子中,b 在任何情况下都知道 a1 和 a2 是正确的。

想想亲子关系:

  1. b 是 a1 的父级并且 a1 是 b 的子级(自然地)

对我来说,只定义一个方向是错误的:

  1. b 是 a1 的父级而不是 a1 是 b 的子级 (???)

为了获得可接受的答案所解释的内容,我想我需要两个连接表:

a_has_b:
a1_id, b_id

b_has_a
b_id, a2_id

我错了吗??

  1. 但是,如何获得“同步”双向关系(不仅仅是 ManyToMany)?
  2. 是否可以使用标准 JPA 功能?
  3. 否则,是否有任何特定的提供程序实现?

我认为实现

...
public void addB(A a)
{
    getA().add(a);
    a.getB().add(this);
}

是一个非常丑陋的 hack...

并且在两侧使用两个单向 OneToMany 在 EclipseLink 2.2.0 中不起作用(不太确定,我目前正在尝试)

谢谢:)

最佳答案

使用,

public void addA(A a)
{
    getA().add(a);
    a.getB().add(this);
}

不是黑客。这是很好的面向对象编程。在任何 Java 模型中,忽略持久性,如果你有一个双向关系,你必须添加到双方来纠正相关的任何事情。您的代码不应仅仅因为您使用或不使用持久性而改变。

如果要单独维护关系,则需要有两个不同的连接表。如果你想要一个单一的 ManyToMany 关系(看起来你想要),那么你必须使用 @ManyToMany 并在一侧设置 mappedBy。

看, http://en.wikibooks.org/wiki/Java_Persistence/ManyToMany

关于java - 从两侧更新双向 ManyToMany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7546161/

相关文章:

NHibernate 多对一级联

java - Spring boot 没有使用 spring 数据和 hibernate 与 sql server 一起运行

java - CascadeType 与 FetchType

java - 无法将应用程序连接到数据库

c# - 多对多导航属性为空

python - 在保存到数据库之前在 session 中使用实例

c# - 加密和解密

java - 将 CST 时区转换为所需的 Java 时区

java - 将Symja和log4j-1.2.11添加到Android Studio后,Gradle构建缓慢

java - 当我在 hibernate 5 中使用 sum 函数时 NullPointerException