Java JPA问题2映射到同一列的属性InvalidStateException:尝试将列设置为两个不同的值
我有以下问题, 我有以下课程:Java JPA问题2映射到同一列的属性InvalidStateException:尝试将列设置为两个不同的值,java,jpa,openjpa,joincolumn,columnmappings,Java,Jpa,Openjpa,Joincolumn,Columnmappings,我有以下问题, 我有以下课程: class C(){ ... @ManyToOne @JoinColumns({ @JoinColumn(name = "B_FK", referencedColumnName = "B_ID"), @JoinColumn(name = "A_FK", referencedColumnName = "A_ID")}) private B b = null; @ManyToOne @
class C(){
...
@ManyToOne
@JoinColumns({
@JoinColumn(name = "B_FK", referencedColumnName = "B_ID"),
@JoinColumn(name = "A_FK", referencedColumnName = "A_ID")})
private B b = null;
@ManyToOne
@JoinColumn(name = "A_FK")
private A a = null;
}
编辑:
@Embeddable
class bPK(){
@Column(name = "B_ID")
private String bId;
@Column(name = "A_ID")
private String aId;
}
class B(){
@EmbeddedId
private bPK b_Pk = null;
@ManyToOne
@MapsId(value = "aId")
@JoinColumn(name = "A_ID")
public A a;
}
class A(){
@Id
@Column(name = "A_ID")
public String aId;
}
类B有一个复合键,我们首先创建了数据库方案,因此我们必须定义用于映射的列名
现在的问题是,如果我们将类C的实例保持为如下所示:
C c = new C();
A a = new A();
a.setId("TEST_ID");
c.setA(a);
em.persist(c);
然后我们得到以下错误:
原因:
org.apache.openjpa.persistence.InvalidStateException:尝试设置
将“C.A_FK”列设置为两个不同的值:(null)“null”,(类
java.lang.String)“TEST_ID”当您未能同时设置这两个参数时,可能会发生这种情况
对象之间双边关系的边,或在映射时
将不同字段添加到同一列,但不保留
这些字段是同步的
由于属性b为null且a的值已设置,jpa尝试将b的a_FK设置为null,并将a的“TEST_ID”设置为null
如果设置了a和b或者两者都为null,那么它可以正常工作,但如果只设置了其中一个,则不能正常工作
有解决这个问题的办法吗?我们希望在b为null的情况下忽略JoinColumns,或者在注释属性为null的情况下,可以选择禁用它们
我们使用OpenJPA 2.2.0。我想你也需要设置
b
。显示b和A的代码(我想两者之间有关系)。@IanMcLaird:是的,如果我设置b,它会工作,但我不想设置它:s@AndreiI是的,a和B之间有关系,请参见我的编辑