引用问题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是正确的。
考虑亲子关系:
对我而言,仅定义一个方向是错误的:
获得接受的答案正在解释我认为我需要两个连接表:
a_has_b:
a1_id, b_id
b_has_a
b_id, a2_id
我错了吗?
我认为实施
...
public void addB(A a)
{
getA().add(a);
a.getB().add(this);
}
是一个非常难看的黑客...
并且在两侧使用两个单向OneToMany在EclipseLink 2.2.0中不起作用(不太确定,我正在尝试)
thx:)
答案 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。根据维基文档,它是不对的。困惑??