Hibernate one to Many adnotare Tutorial
Introducere
acest tutorial Hibernate rapid ne va duce printr-un exemplu de o mapare unu-la-mai-mulți folosind adnotări JPA, o alternativă la XML.
vom afla, de asemenea, ce sunt relațiile bidirecționale, cum pot crea inconsecvențe și cum poate ajuta ideea de proprietate.
lecturi suplimentare:
Boot de primăvară cu hibernare
o prezentare generală a identificatorilor din Hibernate/JPA
descriere
mai simplu spus, maparea unu-la-mulți înseamnă că un rând dintr-un tabel este mapat la mai multe rânduri dintr-un alt tabel.
să ne uităm la următoarea diagramă relație entitate pentru a vedea o asociere unu-la-mai-mulți:
pentru acest exemplu, vom implementa un sistem coș în cazul în care avem un tabel pentru fiecare coș și un alt tabel pentru fiecare element. Un coș poate avea multe articole, așa că aici avem o cartografiere unu-la-mulți.
modul în care funcționează la nivelul bazei de date este că avem un cart_id ca cheie primară în tabelul cart și, de asemenea, un cart_id ca cheie străină în articole.
modul în care o facem în cod este cu @OneToMany.
să mapăm clasa Cart la obiectul Items într-un mod care să reflecte relația din Baza de date:
public class Cart { //... @OneToMany(mappedBy="cart") private Set<Items> items; //...}
putem adăuga și o referință la Cart în Items folosind @ManyToOne, făcând din aceasta o relație bidirecțională. Bidirecțional înseamnă că putem accesa articole din căruțe și, de asemenea, căruțe din articole.
proprietatea mappedBy este ceea ce folosim pentru a spune Hibernate ce variabilă folosim pentru a reprezenta clasa părinte în clasa noastră copil.
următoarele tehnologii și biblioteci sunt utilizate pentru a dezvolta o aplicație de hibernare eșantion care implementează o asociere unu-la-mulți:
- JDK 1.8 sau mai târziu
- Hibernate 5
- maven 3 sau mai târziu
- H2 database
Setup
3.1. Configurarea bazei de date
mai jos este scriptul nostru de baze de date pentru tabelele de coș și articole. Folosim constrângerea cheii străine pentru maparea unu-la-mulți:
configurarea bazei noastre de date este gata, deci să trecem la crearea proiectului Hibernate example.
3.2. Dependențele Maven
vom adăuga apoi dependențele de driver Hibernate și H2 la pom.fișier xml. Dependența Hibernate utilizează logare JBoss, și se adaugă automat ca dependențe tranzitive:
- Hibernate versiunea 5.2.7.Final
- driver H2 versiunea 1.4.197
vă rugăm să vizitați depozitul central Maven pentru cele mai recente versiuni ale Hibernate și dependențele H2.
3.3. Hibernate Configuration
iată configurația Hibernate:
3.4. Clasa HibernateAnnotationUtil
cu clasa HibernateAnnotationUtil, trebuie doar să facem referire la noul fișier de configurare Hibernate:
modelele
configurațiile legate de mapare se vor face folosind adnotări JPA în clasele de model:
@Entity@Table(name="CART")public class Cart { //... @OneToMany(mappedBy="cart") private Set<Items> items; // getters and setters}
vă rugăm să rețineți că adnotarea @OneToMany este utilizată pentru a defini proprietatea din clasa Items care va fi utilizată pentru a mapa variabila mappedBy. De aceea avem o proprietate numită „coș” în clasa articole:
de asemenea, este important să rețineți că adnotarea @ManyToOne este asociată cu variabila clasei Coș. @ JoinColumn adnotare face referire la coloana mapate.
în acțiune
în programul de testare, creăm o clasă cu o metodă principală() pentru a obține sesiunea de hibernare și salvăm obiectele modelului în baza de date implementând asocierea unu-la-mulți:
aceasta este rezultatul programului nostru de testare:
adnotarea @ManyToOne
așa cum am văzut în secțiunea 2, Putem poate specifica o relație multi-la-unu utilizând adnotarea @manytoone. O mapare Multi-la – unu înseamnă că multe instanțe ale acestei entități sunt mapate la o instanță a unei alte entități-multe elemente dintr-un coș.
adnotarea @ManyToOne ne permite să creăm și Relații bidirecționale. Vom acoperi acest lucru în detaliu în următoarele câteva subsecțiuni.
6.1. Inconsecvențe și proprietate
acum, dacă coșul face referire la articole, dar articolele nu au făcut referință la Coș, relația noastră ar fi unidirecțională. Obiectele ar avea, de asemenea, o consistență naturală.
în cazul nostru, însă, relația este bidirecțională, aducând posibilitatea inconsecvenței.
să ne imaginăm o situație în care un dezvoltator dorește să adauge item1 în coș și item2 în cart2, dar face o greșeală, astfel încât referințele dintre cart2 și item2 să devină inconsistente:
așa cum se arată mai sus, item2 face referire la cart2, în timp ce cart2 nu face referire la item2 și asta este rău.
cum ar trebui să hiberneze salvați item2 în baza de date? Va item2 externe cart1 cheie de referință sau cart2?
rezolvăm această ambiguitate folosind ideea unei părți deținătoare a relației; referințele aparținând părții deținătoare au prioritate și sunt salvate în baza de date.
6.2. Elemente ca parte deținătoare
după cum se menționează în specificația JPA din secțiunea 2.9, Este o bună practică să marcați partea multi-la-unu ca parte deținătoare.
cu alte cuvinte, elementele ar fi partea care deține și Cart partea inversă, care este exact ceea ce am făcut mai devreme.
deci, cum am realizat acest lucru?
prin includerea atributului mappedBy în clasa Cart, îl marcăm ca partea inversă.
în același timp, adnotăm și elementele.cart câmp cu @ ManyToOne, ceea ce face elemente partea care deține.
revenind la exemplul nostru de „inconsecvență”, acum Hibernate știe că referința item2 este mai importantă și va salva referința item2 la baza de date.
să verificăm rezultatul:
item1 ID=1, Foreign Key Cart ID=1item2 ID=2, Foreign Key Cart ID=2
deși coșul face referire la item2 în fragmentul nostru, referința item2 la cart2 este salvată în baza de date.
6.3. Cart ca partea care deține
de asemenea, este posibil să marcați partea unu-la-mulți ca partea care deține și partea mulți-la-unu ca partea inversă.
deși aceasta nu este o practică recomandată, să mergem mai departe și să încercăm.
fragmentul de cod de mai jos arată punerea în aplicare a one-to-many side ca partea care deține:
observați cum am eliminat elementul mappedBy și setați multi-to-one @JoinColumn ca insertable și actualizabil la false.
dacă rulăm același cod, rezultatul va fi opus:
item1 ID=1, Foreign Key Cart ID=1item2 ID=2, Foreign Key Cart ID=1
după cum se arată mai sus, acum item2 aparține coșului.
concluzie
am văzut cât de ușor este să implementăm relația unu-la-mulți cu baza de date Hibernate ORM și H2 folosind adnotări JPA.
În plus, am învățat despre relațiile bidirecționale și cum să implementăm noțiunea de parte deținătoare.
Leave a Reply