Java JPA2.0和EJB3.1-更新试图插入记录的所有者方关系?
我有一个模型:Java JPA2.0和EJB3.1-更新试图插入记录的所有者方关系?,java,jpa-2.0,glassfish-3,ejb-3.1,Java,Jpa 2.0,Glassfish 3,Ejb 3.1,我有一个模型: @Entity class A { @ManyToOne B b; int i; } @Entity class B { @OneToMany(mappedBy="b") List< A > list = new ArrayList< A >(); } 此抛出db约束异常插入到B值中。。。与当前B中已存在的值相同 为什么在B表中已经存在一条新记录且关系不持久的情况下,尝试向B插入一条新记录? 注: 1当我在最后一行之后执行
@Entity
class A {
@ManyToOne
B b;
int i;
}
@Entity
class B {
@OneToMany(mappedBy="b")
List< A > list = new ArrayList< A >();
}
此抛出db约束异常插入到B值中。。。与当前B中已存在的值相同
为什么在B表中已经存在一条新记录且关系不持久的情况下,尝试向B插入一条新记录?
注:
1当我在最后一行之后执行以下操作时:
em.merge(a);
这也是工作
2当我做a.setI1时;没有合并-它在DB中更改,就像我想的那样
谢谢 这是一种双向关系。你应该随时更新双方的关系。否则,如果在持久化过程中没有直接出现问题,则很容易损坏缓存并在应用程序中遇到一些错误 所以,如果你有这个:
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.setI1时;不合并-
它在DB中改变了,就像我想的那样
意志
如果您在ejb中使用entityManager,我认为您在标记方面是这样做的,那么对托管实体的更改被持久化是正常的。这是个问题吗
另外,您应该确保实体标识、相等和hashcode的定义是正确的,可能是,但您没有提到。这是一种双向关系。你应该随时更新双方的关系。否则,如果在持久化过程中没有直接出现问题,则很容易损坏缓存并在应用程序中遇到一些错误 所以,如果你有这个:
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.setI1时;不合并-
它在DB中改变了,就像我想的那样
意志
如果您在ejb中使用entityManager,我认为您在标记方面是这样做的,那么对托管实体的更改被持久化是正常的。这是个问题吗
此外,您应该确保实体标识、相等和哈希代码的定义正确,可能是这样,但您没有提到。您的问题确实令人困惑。你在问什么?你能提供更多关于你的模型的信息吗,比如id属性等等?你的问题真的很让人困惑。你在问什么?你能提供更多关于你的模型的信息,比如id属性等吗?