Question

J'ai un bon - POJO mis en correspondance avec deux tables. La première cartographie attribue un nom d'entité « voucherA » et mappe le POJO à TableA. La seconde utilise la cartographie « voucherB » comme nom de l'entité et mappe le POJO à TableB.

Maintenant, j'ai aussi un POJO client mis en correspondance TableC. Cette POJO références bons dans une liste.

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

Comment mapper correctement une liste de plusieurs à plusieurs associations de clients à des bons de sorte que si un POJO client est conservé, les entités Voucher sont conservés à TableB s'ils n'y existent pas, au lieu de TableA? Cela peut-il être fait? Dans le cas contraire, ce serait une solution de contournement ressembler à de sorte que les bons utilisés par les clients sont conservés à tableB? (TableA ne contient que des bons disponibles, pas ceux utilisés)

Était-ce utile?

La solution

Votre modèle de base semble erroné. Votre entité Voucher a probablement de nombreux attributs - faire toutes les changer une fois qu'il est utilisé par un Customer? Je doute que. Et pourtant, vous les dupliquer dans vos tableaux A et B qui signifie que votre schéma n'est pas normalisée.

« Disponible » bon et « utilisé » bon ne sont pas (ou ne devraient pas être) la même entité. Je suggère que vous à la place de créer une nouvelle entité pour UsedVoucher qui relierait à la fois Voucher le plus grand nombre à un et Customer autant à l'un et ne comporter que « changé » propriétés de Voucher (le cas échéant). Ainsi,

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
)

Votre "many-to-many" sur Customer deviendra "one-to-many" (collections de bons utilisés par ce client) Si vous avez besoin comme propriété maintenable; sinon il est facilement récupérable par requête.

Vous ne pouvez pas supprimer physiquement de la table de Vouchers dans ce scénario, bien que (unless en question n'a jamais été utilisé). Vous devez faire une suppression logique à la place.

Autres conseils

Ma suggestion serait de stocker toutes les pièces justificatives dans la même table. Pour établir une distinction entre les utilisés et inutilisés, vous pouvez soit avoir un drapeau booléen ou une valeur discriminante (si vous utilisez l'héritage dans votre code Java).

Même si vous avez des données existantes, il ne semble pas que la migration serait terriblement difficile. Une fois que toutes les pièces justificatives sont dans la même table, leur relation avec les clients devient beaucoup à beaucoup simple.

Je pense que le maintien de deux tables serait difficile. Essentiellement, vous stockez encore si un bon est utilisé ou non, mais vous ne le faites pas explicitement. Je suis sûr qu'il pourrait y avoir une solution, mais je pense que je l'ai indiqué ci-dessus est beaucoup plus simple. Dans mon expérience, c'est la route que j'ai choisi chaque fois face à un problème similaire.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top