Trajne karte s hibernacijom
1. Uvod
U hibernaciji možemo predstaviti odnose jedan-prema-više u našim zrnima Java tako da jedno od naših polja bude a Popis.
U ovom brzom vodiču istražit ćemo razne načine kako to učiniti pomoću a Karta umjesto toga.
2. Kartas se razlikuju od Popiss
Korištenje a Karta predstavljati odnos jedan prema više razlikuje se od a Popis jer imamo ključ.
Ovaj ključ pretvara naš entitet u a trostruko asocijacija, gdje se svaki ključ odnosi na jednostavnu vrijednost ili na ugradivi objekt ili entitet. Zbog toga, koristiti a Karta, uvijek ćemo trebati tablica pridruživanja za pohranu stranog ključa koji se odnosi na nadređeni entitet - ključ i vrijednost.
Ali ova tablica pridruživanja bit će malo drugačija od ostalih tablica spajanja u njoj primarni ključ neće nužno biti strani ključevi roditelja i cilja. Umjesto toga, primarni ključ bit će sastavljen od stranog ključa roditelja i stupca koji je ključ našeg Karta.
Par ključ / vrijednost u Karta mogu biti dvije vrste: vrsta vrijednosti i vrsta entiteta. U sljedećim ćemo odjeljcima pogledati načine za predstavljanje ovih udruga u hibernaciji.
3. Korištenje @MapKeyColumn
Recimo da imamo Narudžba entiteta i želimo pratiti ime i cijenu svih predmeta u narudžbi. Tako, želimo predstaviti a Karta do Narudžba koji će naziv artikla preslikati u cijenu:
@Entity @Table (name = "naloga") narudžba javne klase {@Id @GeneratedValue @Column (name = "id") private int id; @ElementCollection @CollectionTable (name = "order_item_mapping", joinColumns = {@JoinColumn (name = "order_id", referencedColumnName = "id")}) @MapKeyColumn (name = "item_name") @Column (name = "price") private Stavka kartePriceMap; // standardni geteri i postavljači}
Moramo naznačiti hibernaciji gdje dobiti ključ i vrijednost. Za ključ, koristili smo @MapKeyStupac, ukazujući da je KartaKljuč je ime proizvoda stupac naše tablice za pridruživanje, mapiranje_naredbe_naredbe. Slično tome, @Stupac precizira da Karte vrijednost odgovara cijena stupac tablice pridruživanja.
Također, itemPriceMap objekt je karta vrijednosnog tipa, stoga moramo koristiti @ElementCollection bilješka.
Uz objekte osnovnog tipa vrijednosti, @Ugradivo objekti se također mogu koristiti kao KartaVrijednosti na sličan način.
4. Korištenje @MapKey
Kao što svi znamo, zahtjevi se s vremenom mijenjaju - recimo, sada moramo pohraniti još neke atribute Artikal zajedno s ime proizvoda i itemPrice:
@Entity @Table (name = "item") stavka javne klase {@Id @GeneratedValue @Column (name = "id") private int id; @Column (name = "name") private String itemName; @Column (name = "price") private double itemPrice; @Column (name = "item_type") @Enumerated (EnumType.STRING) private ItemType itemType; @Temporal (TemporalType.TIMESTAMP) @Column (name = "created_on") private Datum kreiranjaOn; // standardni geteri i postavljači}
Sukladno tome, promijenimo se Karta do Karta u Narudžba klasa entiteta:
@Entity @Table (name = "naloga") narudžba javne klase {@Id @GeneratedValue @Column (name = "id") private int id; @OneToMany (cascade = CascadeType.ALL) @JoinTable (name = "order_item_mapping", joinColumns = {@JoinColumn (name = "order_id", referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn (name = "item_id", name = "item_id", name = "item_id", referencedColumnName = "id")}) @MapKey (name = "itemName") private Map itemMap; }
Imajte na umu da ćemo ovaj put koristiti @MapKey napomena tako da će Hibernate koristiti Artikal#ime proizvoda kao stupac ključa karte umjesto uvođenja dodatnog stupca u tablicu pridruživanja. Dakle, u ovom slučaju, stolu za spajanje mapiranje_naredbe_naredbenema stupac ključa - umjesto toga, odnosi se na JatemIme.
To je za razliku od @MapKeyColumn. Kada koristimo @MapKeyColumn, ključ karte nalazi se u tablici spajanja. To je razlog zašto ne možemo definirati mapiranje našeg entiteta koristeći obje napomene zajedno.
Također, itemMap je mapa tipa entiteta, stoga moramo komentirati odnos pomoću @OneToMany ili @ManyToMany.
5. Korištenje @MapKeyEnumerated i @MapKeyTemporal
Kad god odredimo enum kao Karta ključ, koristimo @MapKeyEnumerated. Slično tome, za vremenske vrijednosti, @MapKeyTemporal koristi se. Ponašanje je prilično slično standardu @Nabrojeno i @Temporal napomene.
Po zadanom su slični @MapKeyColumn u tome stvorit će se ključni stupac u tablici spajanja. Ako želimo ponovno upotrijebiti vrijednost koja je već pohranjena u trajnom entitetu, polje bismo trebali dodatno označiti s @MapKey.
6. Korištenje @MapKeyJoinColumn
Dalje, recimo da također moramo pratiti prodavača svake stavke. Jedan od načina na koji bismo to mogli učiniti je dodavanje a Prodavač entitet i povezati to s našim Artikal entitet:
@Entity @Table (name = "prodavač") prodavač javne klase {@Id @GeneratedValue @Column (name = "id") private int id; @Column (name = "name") privatni niz prodavačNaziv; // standardni geteri i postavljači}
@Entity @Table (name = "item") stavka javne klase {@Id @GeneratedValue @Column (name = "id") private int id; @Column (name = "name") private String itemName; @Column (name = "price") private double itemPrice; @Column (name = "item_type") @Enumerated (EnumType.STRING) private ItemType itemType; @Temporal (TemporalType.TIMESTAMP) @Column (name = "created_on") private Datum kreiranjaOn; @ManyToOne (cascade = CascadeType.ALL) @JoinColumn (name = "prodavac_id") prodavatelj privatni prodavatelj; // standardni geteri i postavljači}
U ovom slučaju, pretpostavimo da je naš slučaj upotrebe da grupiramo sve Narudžba‘S Artikals by Prodavač. Stoga, promijenimo se Karta do Karta:
@Entity @Table (name = "naloga") narudžba javne klase {@Id @GeneratedValue @Column (name = "id") private int id; @OneToMany (cascade = CascadeType.ALL) @JoinTable (name = "order_item_mapping", joinColumns = {@JoinColumn (name = "order_id", referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn (name = "item_id", name = "item_id", name = "item_id", referencedColumnName = "id")}) @MapKeyJoinColumn (name = "prodavac_id") privatna karta prodavateljMapa; // standardni geteri i postavljači}
Moramo dodati @MapKeyJoinColumn da bi to postigao jer ta napomena omogućava hibernaciji da zadrži prodavač_id stupac (ključ karte) u tablici spajanja mapiranje_naredbe_naredbe zajedno sa item_id stupac. Dakle, u vrijeme čitanja podataka iz baze podataka možemo izvesti a GRUPIRAJ PO operacija lako.
7. Zaključak
U ovom smo članku saznali nekoliko načina ustrajavanja Karta u hibernaciji, ovisno o potrebnom mapiranju.
Kao i uvijek, izvorni kod ovog vodiča može se naći preko Githuba.