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之间有关系,请参见我的编辑