2011-12-03 8 views
1

tableAtableBtableCからエンティティを作成しました。"プライマリキーフィールドに非読み取り専用マッピングが定義されています"

tableAには、tableBへの外部キーがあり、単方向の多対1の関係があります。 tableCには2つの主キーがあり、そのうちの1つはtableAの主キーへの外部キーです。 tableCtableAとの多対1の関係を持ちます。

次に、セッションウィンドウとデータウィンドウから、デザインウィンドウで、tableAの読み取り専用テーブルを作成しました。

そしてtableAtableBの列を選択しました。

私はアプリケーションを実行し、ログウィンドウで次の例外を見ました。

ローカル例外スタック: 例外[EclipseLinkの-46](Eclipseの永続性サービス - 2.1.3.v20110304-r9073):org.eclipse.persistence.exceptions.DescriptorException 例外説明:つの非があるはずです主キーフィールド[tableC.tableA_ID]に対して定義された読み取り専用マッピング。 記述子:RelationalDescriptor(mypack.tableC - > [DatabaseTable(表C)])

tableA_IDtableAの主キーです。

このエラーを解決するにはどうすればよいですか?

+1

コードを含めてください – James

答えて

3

@Entityクラスのコードを投稿してください。

ただし、@ManyToOneの一部としてもう一度フィールドとして(おそらく@EmbeddedIdの一部として)、別々の2つのマッピングでtableCにtableA_ID列があることを推測してください。 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

[PEDANT]私は "TABLECは2つの主キーを持っている" ことにより、あなたは "TABLEC 2つの列で作られた主キーを持っている" を意味することを想定[/ PEDANT]

。 "それから、セッションウィンドウとセッションコントロールを作成しました。デザインウィンドウで、tableAから読み込み専用テーブルを作成しました。"

これは、tableAにマップされたbeanをグローバルに読み取り専用としてマークしたことを意味しますか?その場合、マッピングによっては、hereと同じように遭遇することがあります.EclipeLinkは、読み取り専用エンティティに依存するため、新しいエンティティを作成できないと結論づけています。

+0

tableCには2つの列からなる主キーがあります。 Oracle JDeveloperでは、SessionAJBのtableAFindAllをjspxファイルにドラッグしました。私はtableCのpkクラスも持っています。おかげさまで – PhoenixJon

関連する問題