我正在尝试使用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上的代码之间没有外键缺失;我没有能力改变它。
答案 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;