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:
name
class di quadro, ma assegnare loro un entity-name
logico e un nome di tabella diversi . Session
cui si fornisce entityName
come parametro per distinguere l’uno dall’altro. Cosa ottiene?
entity-type
o l’altro (quindi implica una tabella o l’altra) 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. Quali sono i costi?
Ci sono dei vantaggi rispetto alla sottotipizzazione?
Dovresti farlo?
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