我有以下问题,
我有以下课程:
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为null,则忽略JoinColumns,或者如果带注释的属性为null,则可以选择禁用它们。
我们使用OpenJPA 2.2.0。