0

やあ、

私はEclipseLink APIを使用して動的エンティティを作成し、データベース テーブルに格納されたグラフを表しています。リンクは、リンク ID 列、開始ノード ID 列、終了ノード ID 列、およびその他のユーザー定義列を含む独自のテーブルに格納されます。ノードには独自のテーブルがあり、ノード ID と他のユーザー定義の列が格納されます。

リンク テーブルからノード テーブルへのマッピングを行うとき、API を使用してこれを行っています。

OneToOneMapping startNodeMapping = dynamicLinkTypeBuilder.addOneToOneMapping("startNode", dynamicNodeTypeBuilder.getType(), "NODE_ID");     
OneToOneMapping endNodeMapping = dynamicLinkTypeBuilder.addOneToOneMapping("endNode", dynamicNodeTypeBuilder.getType(), "NODE_ID");

前のコードを実行すると、スタック トレースに次のメッセージが表示されます。

Local Exception Stack: Exception [EclipseLink-48] (Eclipse Persistence Services - 2.3.0.v20110604-r9504): org.eclipse.persistence.exceptions.DescriptorException
Exception Description: Multiple writable mappings exist for the field [TEST_NETWORK_LINK.NODE_ID].  Only one may be defined as writable, all others must be specified read-only.
Mapping: org.eclipse.persistence.mappings.OneToOneMapping[startNodeId]

この例外は、同じエンティティの 2 つのフィールド (startNode と endNode) を別のテーブル/エンティティの同じ列/フィールドにマッピングしているため、スローされます。

このマッピングの問題を解決するにはどうすればよいか知っていますか? 別の戦略を提案していただけますか?テーブル構造を変更することはできず、マッピングの 1 つを「読み取り専用」にしたくありませんが、動的マッピングは自由に変更できます。

ありがとうございました!

4

1 に答える 1

1

問題は、エラー メッセージに示されているとおりです。「NODE_ID」フィールドを startNode マッピングと endNode マッピングの両方で外部キーとして使用しています。基本的に、オブジェクトの startNode は、データベースから読み戻されるときに常に == endNode になります。2 つのマッピングが異なるノードを参照することを意図している場合は、2 つのマッピングに異なるフィールドを指定して、独自の外部キーを使用することをお勧めします。例えば:

OneToOneMapping startNodeMapping = dynamicLinkTypeBuilder.addOneToOneMapping("startNode", dynamicNodeTypeBuilder.getType(), "START_NODE_ID");
OneToOneMapping endNodeMapping = dynamicLinkTypeBuilder.addOneToOneMapping("endNode", dynamicNodeTypeBuilder.getType(), "END_NODE_ID");

どちらも、参照されるテーブルの主キーを自動的に参照します。これは「NODE_ID」であると想定しています。

于 2012-06-11T20:00:45.820 に答える