Jakarta ee “为主键字段定义的非只读映射”

Jakarta ee “为主键字段定义的非只读映射”,jakarta-ee,jpa,oracle11g,eclipselink,Jakarta Ee,Jpa,Oracle11g,Eclipselink,我从数据库中创建了tableA、tableB、tableC中的实体 tableA具有tableB的外键,并且具有单向多对一关系。tableC有两个主键,其中一个是tableA中主键的外键。tableC也与tableA有单向多对一关系 然后我创建了会话bean和数据控件,在设计窗口中,从tableA创建了只读表 我选择了表A和表B中的列 我运行了应用程序,并在日志窗口中看到以下异常 本地异常堆栈: 异常[EclipseLink-46]Eclipse持久性服务-2.1.3.v20110304-r90

我从数据库中创建了tableA、tableB、tableC中的实体

tableA具有tableB的外键,并且具有单向多对一关系。tableC有两个主键,其中一个是tableA中主键的外键。tableC也与tableA有单向多对一关系

然后我创建了会话bean和数据控件,在设计窗口中,从tableA创建了只读表

我选择了表A和表B中的列

我运行了应用程序,并在日志窗口中看到以下异常

本地异常堆栈: 异常[EclipseLink-46]Eclipse持久性服务-2.1.3.v20110304-r9073:org.Eclipse.Persistence.exceptions.DescriptorException 异常描述:应该为主键字段[tableC.tableA_ID]定义一个非只读映射。 描述符:RelationalDescriptormypack.tableC->[DatabaseTablec]

tableA_ID是tableA中的主键


如何解决此错误?

请发布@Entity类的代码

不过,我最好的猜测是,tableC上的tableA_ID列在两个单独的映射中,一次作为@ManyTone的一部分,另一次作为字段,可能作为@EmbeddedId的一部分。JPA只允许您通过单个可写映射来管理基础列

如果需要这两个映射,则必须选择要写入的映射,并使用insertable=false、updateable=false将另一个映射指定为只读

例如:

@Entity
pubilc class TableC {

  // read-write mapping to manage via relationship 
  @ManyToOne(column="tableA_ID")
  private TableA tableA;

  // read-only convenience method to get ID directly w/o navigating relationship
  @Column(name="tableA_ID", insertable=false, updatable=false)
  private Long tableA_ID;
}

请发布@Entity类的代码

不过,我最好的猜测是,tableC上的tableA_ID列在两个单独的映射中,一次作为@ManyTone的一部分,另一次作为字段,可能作为@EmbeddedId的一部分。JPA只允许您通过单个可写映射来管理基础列

如果需要这两个映射,则必须选择要写入的映射,并使用insertable=false、updateable=false将另一个映射指定为只读

例如:

@Entity
pubilc class TableC {

  // read-write mapping to manage via relationship 
  @ManyToOne(column="tableA_ID")
  private TableA tableA;

  // read-only convenience method to get ID directly w/o navigating relationship
  @Column(name="tableA_ID", insertable=false, updatable=false)
  private Long tableA_ID;
}

[pedant]我假设tableC有两个主键,你的意思是tableC有一个由两列组成的主键。[/pedant]

然后我创建了会话bean和数据控件,在设计窗口中,从tableA创建了只读表


这是否意味着您将为tableA映射的bean标记为全局只读?如果是这样,根据映射情况,您可能会遇到与EclipeLink得出的结论相同的情况,即无法创建新实体,因为它依赖于只读实体。

[pedant]我假设tableC有两个主键,您的意思是tableC有一个由两列组成的主键。[/pedant]

然后我创建了会话bean和数据控件,在设计窗口中,从tableA创建了只读表


这是否意味着您将为tableA映射的bean标记为全局只读?如果是这样,根据映射情况,您可能会遇到与EclipeLink得出的结论相同的情况,即无法创建新实体,因为它依赖于只读实体。

tableC的主键由两列组成。在OracleJDeveloper中,我将tableAFindAll从SessionEJB拖到jspx文件中。我还有一个表C的pk类。tableC有一个由两列组成的主键。在OracleJDeveloper中,我将tableAFindAll从SessionEJB拖到jspx文件中。我还有一个表C的pk类。谢谢。见上文-你必须选择你将要写的一本。见上文-你必须选择你将要写的一本