我有以下问题,
我有以下课程:
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);
然后我们得到以下错误:
原因:<openjpa-2.2.0-r422266:1244990 致命用户错误> 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”设置为。
如果设置了 a 和 b 或者两者都为 null,则它可以正常工作,但如果只设置了其中一个则不会。
有解决这个问题的方法吗?我们预计,如果 b 为空,则忽略 JoinColumns,或者在带注释的属性为空的情况下可以禁用它们。
我们使用 OpenJPA 2.2.0。