JPA OneToOne - 访问主键对象时发生内部错误

时间:2015-07-10 19:06:08

标签: java jpa

我正在尝试使用JPA(EclipseLink)建模一个非常简单的OneToOne关系,并且我正在使用描述“访问主键对象时发生内部错误”的异常java.lang.NoSuchFieldException。

TableA与TableB具有OneToOne关系。我需要在TableA实体上有一个TableB实体。

我尝试了什么

@NamedNativeQueries(... ommitted for breviety ...)
@Entity
@Table(name = "TableA")
@Cache(isolation = CacheIsolationType.ISOLATED)
public class TableA implements Serializable {
    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private TableA_Id id; //Code is part of the composite embeded

    @OneToOne
    @JoinColumn(name = "CODE", insertable = false, updatable = false)
    private TableB b;

    //getters + setters 

@NamedNativeQueries(... ommitted for breviety ...)
@Entity
@Table(name = "TableB")
@Cache(isolation = CacheIsolationType.ISOLATED)
public class TableB implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @Column(name = "CODE")
    private String code;

    @Column(name = "DESCRIPTION")
    private String description;

    //getters + setters 

例外:

Exception [EclipseLink-0] (Eclipse Persistence Services - 2.4.0.v20120608-r11652): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: An internal error occurred accessing the primary key object [202].
Internal Exception: java.lang.NoSuchFieldException: b
Descriptor: RelationalDescriptor(com.foo.TableA --> [DatabaseTable(TableA)])

值得注意的是; TableA和TableB上的代码之间没有外键缺失;我没有能力改变它。

1 个答案:

答案 0 :(得分:0)

表A中没有外键引用表B,因此您不能像表格那样拥有表A中的连接列。

@OneToOne
@JoinColumn(name = "CODE", insertable = false, updatable = false)
private TableB b;

此声明要求连接列“代码”在表A中 - 但正如表B中所示,JPA找不到它,因此也是例外。

java.lang.NoSuchFieldException: b

您需要将TableB实体作为TableA中的字段,并且您已声明无法向TableA添加外键。在这种情况下,这不应该是一个大问题,因为联接可以在关系的任何一方。

鉴于您的限制,您可以使双向关系成为TableB(包含连接的一方)和反面的TableA。

尝试以下方法:

@Entity
@Table(name = "TableB")
public class TableB ……
//Owning side of the relationship with the @JoinColumn annotation.
    @OneToOne
    @JoinColumn(name = "CODE", insertable = false, updatable = false)
    private TableA tableA;

@Entity
@Table(name = "TableA")
public class TableA ……..
//Inverse side of the relationship with the MappedBy attribute.
    @OneToOne(MappedBy = tableA)
    private TableB tableB;