2

我有以下问题,

我有以下课程:

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。

4

0 回答 0