您好,
我正在使用 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)从同一实体映射到另一个表/实体中的同一列/字段。
您知道我能做些什么来解决这个映射问题吗?你会建议一个不同的策略吗?我无法更改表结构,我不想让其中一个映射“只读”,但我可以自由更改动态映射。
谢谢!
答案 0 :(得分: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”。