Domanda

Ho un Voucher - POJO mappata a due tavoli. La prima mappatura assegna un nome di entità "voucherA" e associa il POJO a TableA. La seconda mappatura utilizza "voucherB" come nome dell'entità e associa il POJO per TableB.

Ora ho anche un POJO cliente mappato TableC. Questo POJO riferimenti buoni in un elenco.

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

Come posso mappare correttamente un elenco di molti-a-molti associazioni da parte dei clienti per i buoni in modo che se un POJO cliente viene mantenuto, le entità Voucher sono persistenti alla tabella B, se non esistono lì, invece di TableA? Può essere fatto? In caso contrario, quale sarebbe una soluzione simile in modo che i voucher utilizzati dai clienti vengono mantenute a tableB? (TableA contiene solo buoni disponibili, non quelli usati)

È stato utile?

Soluzione

Il modello di base sembra sbagliato. Il tuo entità Voucher ha presumibilmente molti attributi - fare tutto di loro cambiano dopo che è utilizzato da un Customer? Ne dubito. Eppure, li stai duplicando nelle tabelle A e B il che significa che lo schema non è normalizzata.

"Disponibile" buono e buono "usato" non sono (o non dovrebbe essere) la stessa entità. Vorrei invece suggerire che si crea una nuova entità per UsedVoucher che collegherebbe ad entrambi Voucher come molti-a-uno e Customer come molti-a-uno e contenere solo "cambiato" proprietà di Voucher (se presente). Così,

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
)

Il "molti-a-molti", a Customer diventerà "uno-a-molti" (collezioni di Buoni utilizzati da questo cliente) se ne avete bisogno come proprietà mantenibile; altrimenti è facilmente recuperabile tramite query.

Non si può fisicamente eliminare dalla tabella Vouchers in questo scenario, anche se (a meno che non Voucher in questione non è mai stato utilizzato). Dovrete fare una cancellazione logica, invece.

Altri suggerimenti

Il mio suggerimento sarebbe quello di memorizzare tutti i voucher nella stessa tabella. Per distinguere tra quelli usati e non usati si potrebbe o avere un flag booleano o un valore discriminante (se si sta utilizzando l'ereditarietà nel codice Java).

Anche se non avete i dati esistenti non sembra come la migrazione sarebbe terribilmente difficile. Una volta che tutti i buoni sono nella stessa tabella, la loro relazione con i clienti diventa una straight-forward molti-a-molti.

Credo che il mantenimento di due tabelle sarebbe difficile. In sostanza, si sta ancora memorizzare se un voucher viene utilizzato o meno, ma non stai facendo in modo esplicito. Sono sicuro che ci potrebbe essere una soluzione, ma penso che quello che ho descritto sopra è molto più semplice. Nella mia esperienza, questa è la strada che ho scelto ogni volta di fronte a un problema simile.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top