Come devo implementare il database delle transazioni EJB 3.0

4

Nell'entità CustomerTransactions, ho il seguente campo per registrare ciò che il cliente ha acquistato:

@ManyToMany
private List<Item> listOfItemsBought;

Quando penso di più su questo campo, c'è la possibilità che non funzioni perché ai commercianti è permesso di modificare le informazioni dell'articolo (ad esempio prezzo, sconto, ecc ...). Quindi, questo campo non sarà in grado di registrare ciò che il cliente ha effettivamente acquistato al momento della transazione.

Al momento, posso solo pensare a 2 modi per farlo funzionare.

  1. Registrerò i dettagli della transazione in un campo String. Ritengo che in questo modo sarebbe complicato se in seguito avessi bisogno di estrarre alcune informazioni sulla transazione.
  2. Ogni volta che il commerciante modifica le informazioni di un articolo, non aggiornerò direttamente i campi di quell'elemento. Invece, creerò un altro nuovo oggetto con tutte le nuove informazioni e manterrò intatto il vecchio oggetto. Credo che in questo modo sia meglio perché in seguito posso facilmente estrarre informazioni sulla transazione. Tuttavia, il lato negativo è che la mia tabella degli articoli potrebbe contenere molte righe.

Sarei molto grato se qualcuno potesse darmi un consiglio su come affrontare questo problema.

UPDATE: vorrei aggiungere ulteriori informazioni sul design attuale.

public class Customer implements Serializable {
    @OneToMany
    private List<CustomerTransactions> listOfTransactions;
}

public class CustomerTransactions implements Serializable {
    @ManyToMany
    private List<Item> listOfItemsBought;
}

public class Merchant implements Serializable {
    @OneToMany
    private List<Item> listOfSellingItems;
}
    
posta JamesBoyZ 22.09.2011 - 15:54
fonte

3 risposte

1

L'annotazione javax.ejb.TransactionAttribute (@TransactionAttribute) può essere applicata a una classe bean o ai suoi metodi

public class Customer implements Serializable {
    @OneToMany
    private List<CustomerTransactions> listOfTransactions;
}

public class CustomerTransactions implements Serializable {
    @ManyToMany
    private List<Item> listOfItemsBought;
}

public class Merchant implements Serializable {
    @OneToMany
    private List<Item> listOfSellingItems;
}

Esempio:

@Transactional(readOnly = false, propagation=Propagation.SUPPORTS)
public long insertTrade(TradeData trade) throws Exception {
   //JDBC Code...
}

@Transactional(readOnly = false, propagation=Propagation.REQUIRED)
public long insertTrade(TradeData trade) throws Exception {
   //JDBC code...
}


@Transactional(readOnly = true)
public TradeData getTrade(long tradeId) throws Exception {
   return em.find(TradeData.class, tradeId);
}

@Transactional(propagation=Propagation.REQUIRED, rollbackFor=Exception.class)
public TradeData placeTrade(TradeData trade) throws Exception {
   try {
      insertTrade(trade);
      updateAcct(trade);
      return trade;
   } catch (Exception up) {
      //log the error
      throw up;
   }
}
    
risposta data 26.06.2012 - 13:21
fonte
0

La cosa migliore da fare è prendere un pezzo di carta e una penna (o una lavagna / penna) e tracciare le relazioni reali tra il cliente e il commerciante e gli articoli. Pensa a cosa succede quando vai al tuo negozio locale e ordini un elenco di articoli. Pensa anche a quando gli oggetti cambiano fisicamente le mani come parte di una transazione e se questi possono essere modificati o meno ...

Un paio di suggerimenti:

  • Una volta acquistato il gelato e iniziato a mangiarlo, il commerciante non può cambiarlo.
  • Le 5 palle da tennis che ho acquistato (una transazione) non possono essere utilizzate in un'altra transazione con me, le ho già acquistate.

Spero di riuscire a farcela!

    
risposta data 22.09.2011 - 23:30
fonte
0

Una soluzione sarebbe aggiungere un altro livello di classificazione degli articoli qui. Dì, GenericItem.
esempio GenericItem: Shoe
Articoli correlati: scarpa da corsa, scarpa da passeggio, scarpa da corsa scontata, ecc.

Puoi fare in modo che il commerciante selezioni il nome generico quando aggiungi nuovi elementi.

È possibile aggiungere più livelli a seconda della granularità desiderata per la relazione tra il cliente e gli articoli acquistati. È possibile avere un SubItem.
esempio GenericItem: Shoe Sottotitoli: scarpe da corsa, scarpe da passeggio, ecc.
Articoli (per scarpe da corsa): scontati, neri, ecc.

  • Puoi tenere in considerazione quanto segue mentre realizzi l'architettura decisioni:
    • Complessità: quanta complessità in termini di classificazione degli articoli vuoi e che vuoi esporre agli utenti (commercianti)
    • Prestazioni: più complessità si aggiungeranno alle prestazioni
    • Dominio: prevedi che il numero e il tipo di elementi diventino molto alti? in tal caso, vuoi un buon schema di classificazione degli articoli.
    • Normalizzazione: applicalo alla tua progettazione di database per vedere quanto meglio puoi rappresentare e cosa vuoi.
risposta data 25.09.2012 - 09:49
fonte

Leggi altre domande sui tag