映射到同一列的JPA问题2属性InvalidStateException:尝试将列设置为两个不同的值

时间:2013-12-20 12:47:28

标签: 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
    @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。

0 个答案:

没有答案