从双方更新双向ManyToMany

时间:2011-09-25 14:33:40

标签: 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);
  

如果可以保留此状态,您最终会在连接表中输入以下条目:

a1_id, b_id
a2_id, b_id
  

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

在我的情况下,b在每种情况下都知道a1和a2是正确的。

考虑亲子关系:

  1. b是a1的父,而a1是b的孩子(自然地)
  2. 对我而言,仅定义一个方向是错误的:

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

      获得接受的答案正在解释我认为我需要两个连接表:

      a_has_b:
      a1_id, b_id
      
      b_has_a
      b_id, a2_id
      

      我错了吗?

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

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

        是一个非常难看的黑客...

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

        thx:)

3 个答案:

答案 0 :(得分:2)

使用,

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

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

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

请参阅, http://en.wikibooks.org/wiki/Java_Persistence/ManyToMany

答案 1 :(得分:2)

使用两个单向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>();
}

刷新实体将填充列表

答案 2 :(得分:0)

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