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]

抛出此异常是因为我将两个字段(startNode 和 endNode)从同一实体映射到不同表/实体中的同一列/字段。

你知道我能做些什么来解决这个映射问题吗?你会建议不同的策略吗?我无法更改表结构,也不想将其中一个映射设为“只读”,但我可以随意更改动态映射。

谢谢!

4

1 回答 1

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”。

于 2012-06-11T20:00:45.820 回答