3

参考问题保存双向多对多我想准确地获得什么被接受的答案解释为不正确:

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 呢?

在我的情况下,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. 但是,如何获得“同步”的双向关系(不仅仅是多对多)?
  2. 标准 JPA 功能是否可行?
  3. 否则,是否有任何特定的提供者实现?

我认为实施

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

是一个非常丑陋的黑客......

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

谢谢 :)

4

3 回答 3

3

使用,

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

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

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

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

于 2013-07-09T13:28:43.757 回答
3

使用两个单向 OneToMany 就可以了:

@Entity
@Table
public class A implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id", nullable = false)
    private Long id;

    @OneToMany
    @JoinTable(name="a_b", 
        joinColumns = @JoinColumn(name = "a_id", nullable = false), 
        inverseJoinColumns = @JoinColumn(name = "b_id", nullable = false)
    )
    private List<B> bList = new ArrayList<B>();
}

---------------------------------------------------------------------------------

@Entity
@Table
public class B implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Basic(optional = false)
    @Column(name = "id", nullable = false)
    private Long id;

    @OneToMany
    @JoinTable(name="a_b", 
        joinColumns = @JoinColumn(name = "b_id", nullable = false), 
        inverseJoinColumns = @JoinColumn(name = "a_id", nullable = false)
    )
    private List<A> aList = new ArrayList<A>();
}

刷新实体将填充列表

于 2013-08-04T12:41:51.710 回答
1

我在通过非拥有方进行更新时遇到了问题。我把@ManyToMany 和@JoinTable 放在两边(没有mappedBy)。它运行良好。我正在使用 Hibernate 4.1.10.Final。根据维基文档,这是不对的。使困惑 ??

于 2013-07-09T08:59:16.327 回答