2012-06-11 39 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表中的外键名。感谢您在我的代码中捕获错误! –