【问题标题】:"non-read-only mapping defined for the primary key field"“为主键字段定义的非只读映射”
【发布时间】:2011-12-03 14:05:55
【问题描述】:

我从我的数据库中创建了 tableAtableBtableC 的实体。

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

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

我选择了tableAtableB 中的列。

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

本地异常堆栈: 异常 [EclipseLink-46] (Eclipse Persistence Services - 2.1.3.v20110304-r9073): org.eclipse.persistence.exceptions.DescriptorException 异常描述:应该为主键字段 [tableC.tableA_ID] 定义一个非只读映射。 描述符:RelationalDescriptor(mypack.tableC --> [DatabaseTable(tableC)])

tableA_IDtableA 中的主键。

我该如何解决这个错误?

【问题讨论】:

    标签: jakarta-ee jpa oracle11g eclipselink


    【解决方案1】:

    请发布您的@Entity 课程的代码。

    不过,我最好的猜测是,tableC 上的 tableA_ID 列在两个单独的映射中,一次是 @ManyToOne 的一部分,另一次是字段(可能是 @EmbeddedId 的一部分)。 JPA 仅允许您通过单个可写映射管理底层列。

    如果你想要这两种映射,你必须选择你将使用哪一个来编写,并使用insertable=false, updatable=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;
    }
    

    【讨论】:

    • 见上文 - 你必须选择你将使用哪一个来写
    【解决方案2】:

    [pedant]我想“tableC 有两个主键”是指“tableC 有一个由两列组成的主键”。[/pedant]

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

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

    【讨论】:

    • tableC 有一个由两列组成的主键。在 Oracle JDeveloper 中,我将 tableAFindAll 从 SessionEJB 拖到 jspx 文件中。我也有 pk 类的 tableC。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 2021-08-16
    • 2014-03-07
    相关资源
    最近更新 更多