Asignación de dos campos a la misma columna con la API de EclipseLink

Hola,

Estoy usando el API de enlace de Eclipse para crear entidades dinámicas para representar un gráfico almacenado en tablas de bases de datos. Los enlaces se almacenan en su propia tabla, que contiene una columna de ID de enlace, las columnas de ID de nodo inicial y de ID de nodo final, además de otras columnas definidas por el usuario. Los nodos tienen su propia tabla, donde se almacena un ID de nodo más otras columnas definidas por el usuario.

Al hacer el mapeo de la tabla de enlaces a la tabla de nodos, estoy haciendo esto con la API:

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

Al ejecutar el código anterior, recibo el siguiente mensaje en el seguimiento de la pila:

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]

Esta excepción se produce porque estoy asignando dos campos (startNode y endNode) de la misma entidad a la misma columna/campo en una tabla/entidad diferente.

¿Sabes qué podría hacer para resolver este problema de mapeo? ¿Sugeriría una estrategia diferente? No puedo cambiar la estructura de las tablas y no quiero hacer una de las asignaciones de "solo lectura", pero soy libre de cambiar las asignaciones dinámicas.

¡Gracias!

preguntado el 11 de junio de 12 a las 19:06

1 Respuestas

El problema es que, como indica el mensaje de error, está utilizando el campo "NODE_ID" como clave externa en las asignaciones de startNode y endNode. Esencialmente, el startNode de su objeto siempre será == el endNode cuando se lea de nuevo desde la base de datos. Creo que querrá especificar diferentes campos para las dos asignaciones si están destinadas a hacer referencia a diferentes nodos, de modo que usen su propia clave externa. p.ej:

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

Ambos harán referencia automáticamente a la clave principal en la tabla a la que se hace referencia, que supongo que es "NODE_ID".

Respondido el 11 de junio de 12 a las 21:06

Ya veo, pasé por alto ese detalle, estaba tratando de usar el nombre de la columna utilizada en la tabla Node en lugar de los nombres de clave externa en la tabla Link. ¡Gracias por detectar ese error en mi código! - abel morelos

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.