【问题标题】:JPA 2.0 & EJB 3.1 - update the owner side relationship was trying to insert record?JPA 2.0 & EJB 3.1 - 更新所有者方关系试图插入记录?
【发布时间】:2011-06-09 16:51:29
【问题描述】:

我有一个模型:

@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 中发生了变化(就像我想的那样)

谢谢!!!

【问题讨论】:

  • 您的问题确实令人困惑。你在问什么?
  • 您能否提供有关您的模型的更多信息,例如 id 属性等?

标签: java jpa-2.0 glassfish-3 ejb-3.1


【解决方案1】:

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

所以,如果你有这个:

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);没有合并 - 它在数据库中发生了变化(就像我想的那样 会)

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

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

【讨论】:

    猜你喜欢
    • 2012-08-08
    • 2012-06-15
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多