gpt4 book ai didi

java - JPA 2.0 和 EJB 3.1 - 更新所有者方关系是否试图插入记录?

转载 作者:行者123 更新时间:2023-11-29 09:23:22 24 4
gpt4 key购买 nike

我有一个模型:

@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);
}

这会抛出数据库约束异常(插入 B 值...具有当前 B 中已经存在的相同值)。

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

注意事项:

1 当我在最后一行之后做的时候:

em.merge(a);

它也能工作...???

2 当我执行 a.setI(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 When i do a.setI(1); without merge - it's changed in DB (like i thought it will)

如果您在 ejb 中使用 entityManager(关于您的标签,我认为您是这样做的),对受管实体的更改被持久化是正常的。那是个问题吗?

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

关于java - JPA 2.0 和 EJB 3.1 - 更新所有者方关系是否试图插入记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4700761/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com