hibernate due tabelle per una entity framework

Ho un’ quadro – User . È descritto da User.class .

Hibernate crea una tabella per quadro, quindi quando chiamo session.save(user) , i miei dati vengono sempre salvati in questa tabella.

Ora ho bisogno di un’altra tabella per i dati dello stesso tipo di User , e ho bisogno di salvare la mia quadro solo su quella tabella.

Struttura dei dati (qualcosa di simile a questo):

 table users_1_table{ string id; string username; } table users_2_table{ string id; string username; } 

lavorare con questo :

 session.save(user1,"users_1_table") session.save(user2,"users_2_table") 

e di conseguenza dovrei avere user1 in users_1_table e user2 in users_2_table .

A causa della limitazione del sistema, non posso mettere questi due oggetti in una tabella. (Anche creare campi extra è una pessima idea).

Posso farlo senza sottoclassi? Usando la configurazione di ibernazione programmaticamente?

Prefazione:

Questa è una domanda molto diffusa anche su SO, e anche ampiamente le risposte sono legate all’approccio Subclass o in realtà SuperClass (es. [ 1 ])

Risposta reale:

Su questi post [ 2 ], [ 3 ] suggeriscono di utilizzare un mapping xml con il parametro EntityName .

Quindi, mappando con xml non hai bisogno di supeclass, basta dare il parametro EntityName a due mapping identici.

Mappatura di esempio:

               

Quindi, a seconda del tipo di quadro di cui hai bisogno, chiami i metodi di sessione appropriati come:

_session.Save("User1Object", user1)

o

_session.Save("User2Object", user2)

I post 2 e 3 sono stati usati come base per questo frammento. Fonte ufficiale [ 4 ]

Dopo la partita:

Una risposta alla prima domanda che è in realtà un link a questo post [ 5 ] presenta un approccio diverso:

Dite ciao alla prima istanza dell’object, clonate i dati su nuova istanza e persistete con un nome diverso. Quindi, nessuna violazione della logica di Hibernate e del contenuto di tutti: stessi dati su due tabelle e nessuna sottoclassi utilizzata.

Bene, l’implementazione o il codice o la credibilità di tale approccio è così e così, non l’ho nemmeno provato.

Un altro caso:

In questo post [ 6 ] c’è un’altra persona che tenta di sfidare l’approccio di super class con qualcosa di più semplice, ma ancora una volta, la risposta più credibile afferma che non è ansible un altro modo, l’approccio ufficiale non-xml è il suddetto approccio di sottoclass.

fonti

[1] Come mappare una class a diverse tabelle usando le annotazioni hibernate / jpa

[2] Mappa due tabelle identiche (stesso schema …) alla stessa quadro in Hibernate

[3] Come mappare 2 tabelle identiche (stesse proprietà) in 1 quadro

[4] http://docs.jboss.org/hibernate/core/3.2/reference/en/html/mapping.html#mapping-entityname

[5] Hibernate 4: una mapping di classi Due tabelle – Come mantenere un object su entrambe le tabelle?

[6] Annotazione di ibernazione per quadro esistente in più di 1 catalogo

Funziona anche usando un’ quadro predefinita e una alternativa:

               

Per quello predefinito, è ansible utilizzare il metodo

 _session.Save(user1) 

e

 _session.Save("User2Object", user2) 

per quello alternativo.

Puoi farlo usando la configurazione:

  • Creare due mapping per lo stesso name class di quadro, ma assegnare loro un entity-name logico e un nome di tabella diversi .
  • Quindi utilizzare i metodi Session cui si fornisce entityName come parametro per distinguere l’uno dall’altro.

Cosa ottiene?

  • “Sottotipizzazione virtuale”
  • Quando si recuperano i dati nel tipo, è necessario specificare un entity-type o l’altro (quindi implica una tabella o l’altra)
  • Quando modifichi i dati e li salvi, devi specificare lo stesso entity-type : un tentativo di aggiornamento con un diverso entity-type deve essere rifiutato dalla sospensione. Altrimenti, le quadro modificate avranno già un identificatore popolato, quindi Hibernate proverà ad aggiornare anziché inserire, ma fallirà nel database – tenterà di aggiornare i dati che non sono mai esistiti nella tabella.
  • Questo porta alla segregazione: devi impegnarti a un tipo di entity framework quando lavori su un’ quadro o un elenco di quadro e non puoi mischiare le due. cioè “sottotipo virtuale”

Quali sono i costi?

  • Dà una digitazione molto debole. Il compilatore e il runtime non hanno alcuna indicazione del vero sottotipo. Gli errori stanno per accadere e potrebbe essere complicato eseguire il debug.
  • È non standard. JPA ha evitato questo, credo che non sia nel radar per l’inclusione, e per una buona ragione.
  • Devi usare XML, non le annotazioni.
  • Devi chiamare metodi insoliti, incluso il parametro “tipo- quadro”.

Ci sono dei vantaggi rispetto alla sottotipizzazione?

  • Nessuno che io possa vedere

Dovresti farlo?

  • Io non la penso così! Usa sottotitoli e codice standard.

Anche se non l’ho mai usato ma c’è un concetto di Secondary Table in ibernazione. E @SecondaryTables è l’annotazione in sospensione in base alla quale un’entity framework può mappare più di una tabella per recuperare i dati. L’ quadro che sta recuperando i dati dovrebbe avere annotazioni @SecondaryTables. Associa la tabella secondaria sulla base della chiave primaria ed esterna e anche sulla base di vincoli unici.

Ecco un esempio che ho trovato dopo aver fatto google, controlla se ti aiuta a raggiungere:

http://www.concretepage.com/hibernate/secondarytables_hibernate_annotation.php