2011-12-03 35 views
1

而且我从我的数据库创建了来自tableA,tableB,tableC的实体。“为主键字段定义的非只读映射”

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

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

而且我选择了tableAtableB中的列。

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

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

tableA_ID是在tableA主键。

我该如何解决这个错误?

+1

请包括代码 – James

回答

3

请发布您的@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; 
} 
+0

是的。该代码与您发布的代码相同。我能做什么? – PhoenixJon

+0

参见上面 - 你必须选择你要用哪一个来写 – wrschneider

0

[学究]我假定由“表C具有两个主键”您的意思是“表C具有由两列组成的主键” [/学究]

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

这是否意味着您将标记为tableA的bean映射为全局只读?如果是这样,根据映射的不同,您可能会遇到与here相同的地方,EclipeLink得出结论:创建新实体是不可能的,因为它取决于只读实体。

+0

tableC有一个由两列组成的主键。 在Oracle JDeveloper中,我将TableAFindAll从SessionEJB拖入jspx文件中。我也有p类的tableC。 谢谢。 – PhoenixJon

相关问题