2

我有一个模型:

@Entity
class A {
   @ManyToOne
   B b;
   int i;
}

@Entity
class B {
   @OneToMany(mappedBy="b")
   List< A > list = new ArrayList< A >();
}

现在在我的 EJB 服务中,我这样做:

void f(Aid,Bid){
   A a = em.find(A.class, Aid);
   B b = em.find(B.class, Bid);
   a.setB(b);
}

这会引发 db 约束异常(INSERT INTO B VALUES... WITH SAME VALUES THAT ALREADY EXIST IN CURRENT B)。

  1. 为什么在 B 表中已经存在且关系不是 PERSIST 的情况下尝试向 B 插入新记录?

笔记:

1 当我在最后一行之后做:

em.merge(a);

它也工作......???

2 当我这样做时a.setI(1);没有合并 - 它在 DB 中发生了变化(就像我想的那样)

谢谢!!!

4

1 回答 1

0

是双向的关系。您应该始终更新关系船的双方。否则,如果您在持久化时没有直接遇到问题,那么您很容易损坏缓存并在应用程序中遇到一些奇怪的错误。

所以,如果你有这个:

A a = em.find(A.class, Aid);
B b = em.find(B.class, Bid);
a.setB(b);

你应该在之后添加这个:

List<A> aList = b.getList();
if (!aList.contains(b)) {
    aList.add(b);
}

2 当我做 a.setI(1); 没有合并 - 它在 DB 中发生了变化(就像我想的那样)

如果您在 ejb 中使用 entityManager(我似乎对您的标签这样做了),则对托管实体的更改会持续存在是正常的。是那个问题吗?

此外,您应该确保实体标识、equals() 和 hashcode() 定义正确(也许是,但您没有提及)。

于 2011-03-26T19:44:35.320 回答