nhibernate - mapeo - mapear tablas hibernate eclipse
Mapeo NHibernate uno a uno donde los datos de la segunda tabla pueden ser nulos (2)
El mapeo uno a uno en nhibernate no funciona de la manera que crees. Está diseñado para que tenga dos clases, que cuando persisten en sus tablas correspondientes tienen las mismas claves principales.
Sin embargo, puedes hacerlo funcionar, pero no es bonito. Te mostraré cómo ofrecer algunas alternativas:
En su transacción hbml:
<one-to-one name="Sequence" class="TransactionSequence" property-ref="Transaction"/>
En tu Secuencia html:
<many-to-one name="Transaction" class="Transaction" column="fk_Transaction_Sequence" />
Esto debería hacer lo que quieras que haga. Tenga en cuenta la propiedad-ref.
La próxima pregunta sobre la que va a publicar va a preguntar cómo obtiene la carga diferida en asociaciones de uno a uno. La respuesta es: no puedes ... bueno, puedes, pero probablemente no funcionará. El problema es que tiene su clave externa en la tabla de secuencia, lo que significa que nhibernate tiene que golpear la base de datos para ver si existe el objetivo. Luego puede intentar jugar con constrained = "true / false" para ver si puede persuadirlo de que cargue la asociación uno a uno.
Con todo, va a resultar en una pérdida total de su tiempo.
Sugiero cualquiera de los siguientes:
- Tener dos asociaciones de muchos a uno.
- Tener una asociación muchos a uno con una colección en el otro extremo.
Esto te ahorrará muchos dolores de cabeza a largo plazo.
Tengo una base de datos existente con la tabla Transacciones en ella. He agregado una nueva tabla llamada TransactionSequence donde cada transacción finalmente tendrá un solo registro. Estamos usando la tabla de secuencias para contar las transacciones de una cuenta determinada. He correlacionado esto como una asignación de uno a uno donde TransactionSequence tiene una clave principal de TransactionId.
La restricción es que hay un activador en lugar de la tabla de transacciones que no permite actualizaciones de transacciones canceladas o contabilizadas.
Entonces, cuando se calcula la secuencia y se guarda la transacción, NHibernate intenta enviar una actualización de la transacción como ''ACTUALIZAR Transacción SET TransactionId =? DONDE TransactionId =? ''. Pero esto falla debido al desencadenante. ¿Cómo puedo configurar mi asignación para que NHibernate no intente actualizar la tabla de transacciones cuando se inserta una nueva tabla TransactionSequence?
Mapeo de transacciones:
<class name="Transaction" table="Transaction" dynamic-update="true" select-before-update="true">
<id name="Id" column="ID">
<generator class="native" />
</id>
<property name="TransactionTypeId" access="field.camelcase-underscore" />
<property name="TransactionStatusId" column="DebitDebitStatus" access="field.camelcase-underscore" />
<one-to-one name="Sequence" class="TransactionSequence" fetch="join"
lazy="false" constrained="false">
</one-to-one>
</class>
Y el mapeo de la secuencia:
<class name="TransactionSequence" table="TransactionSequence" dynamic-update="true">
<id name="TransactionId" column="TransactionID" type="Int32">
<generator class="foreign">
<param name="property">Transaction</param>
</generator>
</id>
<version name="Version" column="Version" unsaved-value="-1" access="field.camelcase-underscore" />
<property name="SequenceNumber" not-null="true" />
<one-to-one name="Transaction"
class="Transaction"
constrained="true"
foreign-key="fk_Transaction_Sequence" />
</class>
Cualquier ayuda sería muy apreciada ...
Resulta que, para mi situación, un mapeo de <join table>
funcionaba mejor. Solo tenía que asegurarme de que hice que las propiedades que venían de la segunda tabla fueran tipos anulables, o haría una inserción en guardar incluso si nada hubiera cambiado. Como no necesitaba carga lenta para la segunda mesa, esto funciona muy bien. Estoy seguro de que podría haber conseguido asignaciones emparejadas de uno a uno, pero no fue intuitiva y parece más complicada que la opción de combinación de tabla, sin embargo, <join table>
solo está disponible en NHibernate 2.0 y posteriores.