[英]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.