2010-08-17 13 views
10

Attualmente sto bloccato con quello che sembra essere un problema molto semplice, ma io proprio non riesco a trovare un modo per aggirare:Come mappare una classe di diverse tabelle usando Hibernate/JPA annotazioni

ho 2 identici tabelle:

  1. tbl_creditcard_approved_txns
  2. tbl_creditcard_declined_txns

I campi in entrambi sono iden tical, e ho una classe - Transaction che viene utilizzata per rappresentare tutti i campi appropriati nelle tabelle.

Sto provando a mappare due entità diverse (una per ogni tabella) alla classe precedente. Nel vecchio mondo, avrei creato due file hbm.xml, uno per ogni tabella e mapparli entrambi a Transaction. Quindi utilizzerei il nome dell'entità durante la persistenza per garantire che l'oggetto venga mantenuto nella tabella corretta, a seconda della circostanza.

Attualmente sto cercando di utilizzare le annotazioni al momento per ottenere lo stesso risultato, ma finora non ho avuto fortuna nel mappare le due entità in una classe singola. Ciò è effettivamente possibile?

Attualmente sto utilizzando un approccio diverso in quanto ho estratto tutti i campi comuni (nomi di colonna identici) in uno @MappedSuperClass e ho creato due classi separate (una per ogni entità) che si estendono dalla super classe (queste le classi hanno solo gli stessi campi con nomi di colonne diversi, dove applicabile).

+0

possibile duplicato di [JPA, Come utilizzare la stessa classe (entità) per mappare tabelle diverse?] (Http://stackoverflow.com/questions/997203/jpa-how-to-use-the-same-class -entity-to-map-different-tables) –

+0

Pascal, Questa è davvero l'intenzione, l'unica differenza è che vorrei che due entità diverse fossero mappate sulla stessa classe. A differenza di JPA, in ibernazione, le classi possono essere disparate dalle entità. In sostanza, tuttavia, sto davvero cercando di mappare una classe su due tabelle. – Jay

risposta

18

Utilizzando @MappedSuperclass, si sarebbe procedere come segue:

@MappedSuperclass 
public class Transaction ... 

@Entity 
@Table(name="tbl_creditcard_approved_txns") 
public class DeclinedTransaction extends Transaction ... 

@Entity 
@Table(name="tbl_creditcard_declined_txns") 
public class ApprovedTransaction extends Transaction ... 

Usa @AttributeOverride per ignorare i nomi di colonna tra i due tipi di oggetti di transazione, se necessario.

Aggiornamento: Vedo che si desidera mappare una @Entity a due tabelle nella stessa EntityManagerFactory ... Non penso che si possa fare ciò.

+1

LES2, Grazie, per la risposta. Quello che hai suggerito è l'approccio che ho preso al momento. Come hai osservato, mi chiedevo se fosse possibile mappare un'entità su due tabelle diverse. – Jay

+0

se sposto una riga da una tabella all'altra, come posso assicurarmi che l'ID della riga sia mantenuto lo stesso? – splinter123

+0

sembra una cattiva idea, ma non sono del tutto sicuro del perché :) è solo contro il mio istinto. qual è il caso d'uso per mantenere lo stesso ID riga? – les2

2

L'altro modo per farlo sarebbe utilizzare una tabella parzializzata sul livello del database che renderebbe quindi visibile una singola tabella al codice java.

Questa è probabilmente la strada da percorrere come regola generale, più il partizionamento è intelligente, più velocemente le query possono essere.

2

Devi usare due differenti unità di persistenza o due entità separate. Questo ha già risposto here.

Problemi correlati