¿Cómo asignar una asociación de muchos a muchos a una clase asignada a dos tablas diferentes?

StackOverflow https://stackoverflow.com/questions/1662122

Pregunta

Tengo un Vale - POJO asignado a dos tablas.La primera asignación asigna un nombre de entidad "valeA" y asigna el POJO a la TablaA.La segunda asignación utiliza "voucherB" como nombre de entidad y asigna el POJO a la TablaB.

Ahora también tengo un POJO de cliente asignado a TableC.Este POJO hace referencia a vales en una lista.

<list name="vouchers" table="TableC_vouchers">
  <key column="pid"/>
  <list-index column="position" base="0"/>

  <!-- how to do that right -->
  <many-to-many column="voucher_id" entity-name="voucherB"/>
</list>

¿Cómo asigno correctamente una lista de asociaciones de muchos a muchos de clientes a vales para que, si se persiste el POJO de un cliente, las entidades del vale persistan en la TablaB si no existen allí, en lugar de en la TablaA?Se puede hacer esto?Si no es así, ¿cómo sería una solución alternativa para que los vales utilizados por los clientes persistan en la tabla B?(La Tabla A contiene solo los vales disponibles, no los usados)

¿Fue útil?

Solución

Su modelo de núcleo parece mal. Su entidad Voucher presumiblemente tiene muchos atributos - hacer todas ellas cambian después de que se utiliza por un Customer? Dudo que. Y, sin embargo, que los está duplicando en las tablas A y B que significa que su esquema no está normalizado.

"Disponible" y el bono bono "usado" no son (o no debería ser) la misma entidad. En vez de ello sugeriría que se crea una nueva entidad para la UsedVoucher que uniría a ambos Voucher como muchos-a-uno y Customer como muchos-a-uno y sólo contienen "transformados" propiedades de Voucher (si lo hay). Por lo tanto,

Voucher(id, other attributes) // doesn't change from what you have now
Customer (id, other attributes) // doesn't change except for many-to-many; see below
UsedVoucher(id,
 voucher, // what Voucher was used by that customer
 customer, // what Customer has used that voucher
 changed voucher attributes, // if any
 additional attributes // if needed, such as date/time when voucher was used
)

Su "muchos-a-muchos" en la Customer llegará a ser "uno-a-muchos" (colecciones de vales utilizados por este cliente) si la necesita como propiedad de mantener; de lo contrario es fácilmente recuperable a través de la consulta.

No se puede eliminar físicamente de mesa Vouchers bajo este escenario, aunque (a no ser que vale en cuestión nunca fue utilizado). Vas a tener que hacer un borrado lógico en su lugar.

Otros consejos

Mi sugerencia sería almacenar todos los vales en la misma tabla.Para distinguir entre los usados ​​y los no utilizados, puede tener un indicador booleano o un valor discriminador (si está usando herencia en su código Java).

Incluso si tiene datos existentes, no parece que la migración sea terriblemente difícil.Una vez que todos los vales están en la misma tabla, su relación con los clientes se convierte en una sencilla relación de muchos a muchos.

Creo que mantener dos mesas sería difícil.Básicamente, todavía estás almacenando si se usa un cupón o no, pero no lo haces explícitamente.Estoy seguro de que podría haber una solución, pero creo que lo que describí anteriormente es mucho más simple.En mi experiencia, esta es la ruta que he elegido cada vez que me enfrento a un problema similar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top