繁体   English   中英

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

[英]JPA OneToOne - An internal error occurred accessing the primary key object

我正在尝试使用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上的代码之间没有伪造的外键; 我没有能力改变这种状况。

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

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

该语句要求连接列“ Code”在表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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM