2012-06-11 40 views
0

您好同一列,映射兩個字段與的EclipseLink API

我使用的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] 

引發此異常是因爲我將兩個字段(startNode和endNode)從同一實體映射到不同表/實體中的同一列/字段。

你知道我能做些什麼來解決這個映射問題嗎?你會建議一個不同的策略?我無法更改表格結構,也不想讓其中一個映射爲「只讀」,但我可以自由更改動態映射。

謝謝!

回答

1

問題出在錯誤消息狀態 - 您在startNode和endNode映射中都使用「NODE_ID」字段作爲外鍵。從數據庫讀回時,基本上你的對象的startNode總是== endNode。我相信你會想爲兩個映射指定不同的字段,如果它們是爲了引用不同的節點,所以他們使用自己的外鍵。例如:

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

兩者都會自動引用被引用表中的主鍵,我認爲它是「NODE_ID」。

+0

我明白了,我忽略了那個細節,我試圖使用Node表中使用的列名而不是Link表中的外鍵名。感謝您在我的代碼中捕獲錯誤! –