GLI EMBEDDED OBJECTS
In certi casi la mappatura delle classi non è esattamente uguale alla struttura della tabella. Prendiamo in esame la tabella Premi dove sono stati aggiunti altri campi. Questi elementi sono tipici di una tabella anagrafica, però sono ugualmente stati inseriti nella tabella, anche se in questi casi è bene suddividere le due tabelle. Il nostro obbiettivo è quello di distinguere all’interno delle classi di entità la parte anagrafica da quella che è più informativa dei flussi.
LA CLASSE INFOPREMI
Quindi dobbiamo creare un’altra classe, però questa classe è speciale, è una classe embedded richiamata dalla nostra classe Premi. Ho creato una nuova classe InfoPremi.java che non è una classe di entità. È stata importata a tutti gli effetti nella nostra classe Premi con la notazione @Embedded, mentre la notazione @Embeddable, in InfoPremi indica che questa classe può essere importata in una classe entity.
Ora ci si potrebbe domandare per quale motivo va fatta una cosa del genere? La risposta è che a volte le tabelle possono avere molti campi, allora risulta utile suddividerle in più classi. Dal punto di vista dell’ordine del codice quello che abbiamo fatto è decisamente più leggibile. @Embedded richiamerà tutte le informazioni che sono presenti nella classe InfoPremi. Vai in debug e guarda come sia stata incorporata la classe InfoPremi (immagine sotto riportata).
STRATEGIA DI GENERAZIONE DELLA CHIAVE PRIMARIA
È venuto il momento di vedere altre tipologie di strategy di generazione della chiave primaria. Per effettuare delle prove utilizzeremo la tabella Coupons.
La relazione come vedi è uno-a-molti, cioè ad un Cliente possono corrispondere diversi coupons. Creiamo la classe di entità Coupons. Ho creato un nuovo Controller CouponsController, le classi DAO e le classi di Servizio.
La strategia AUTO lascia ad Hibernate, sulla base della natura del database relazionale, la strategia ottimale per attribuire la chiave primaria. Quando vi è una relazione uno-a-molti bisogna specificare le due vie, una dalla parte Coupons dove la correlazione è molti-a-uno specificata con la notazione @ManyToOne e la notazione @JoinColumn.
@ManyToOne
@JoinColumn(name = “IdCliente”, referencedColumnName = “CODFIDELITY”)
private Clienti cliente;
mentre nella parte clienti la correlazione è uno-a-molti
@OneToMany(fetch = FetchType.EAGER, mappedBy = “cliente”)
private Set coupons = new HashSet<>();
LA STRATEGIA DI GENERAZIONE DELLA CHIAVE PRIMARIA TABLE
Specifichiamo ora TABLE come strategia di generazione della chiave primaria. Ciò significa che L’Id si deve basare su una specifica tabella. Proviamo a lanciare il programma e vediamo cosa succede. Otteniamo un errore perché Hibernate va a cercare la seguente tabella:
Anziché lasciare ad Hibernate il compito di andare a creare una specifica tabella abilitando quindi la DDL (Data Definition Language) nella configurazione, creiamo noi una tabella chiamata Progressivi e istruiamo Hibernate ad utilizzare tale tabella.
Stiamo dicendo ad Hibernate cerca Coupons all’interno di una specifica tabella, la tabella Progressivi. Dobbiamo specificare anche con la notazione @GeneratedValue il nome del generatore che sarà Coupons configurato nel TableGenerator. Una volta fatto questo mettiamo in esecuzione l’applicazione e incolliamo nel browser il seguente indirizzo.
http://localhost:8080/AlphaShopv6/coupons/aggiungi/67301895
Verrà inserito un nuovo Coupons con l’identificativo generato mediante la strategia Table. Verrà aggiornata anche la tabella dei Progressivi. In MySQL Server non ho trovato la tabella progressivi, se anche per te è lo stesso ti lascio le istruzioni per crearla e un breve video per l’importazione dei due record da un file .csv disponibile al download.
DOWNLOAD CODICE DELL’ARTICOLO
Il progetto AlphaShopV6.zip è per il DBMS SQL Server mentre AlphaShopV7.zip è per MySQL.
Scrivi un commento