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.