Vedvarende kort med dvale

1. Introduktion

I dvale kan vi repræsentere en-til-mange-forhold i vores Java-bønner ved at have et af vores felter til at være et Liste.

I denne hurtige vejledning undersøger vi forskellige måder at gøre dette på med Kort i stedet.

2. Korts adskiller sig fra Listes

Brug af en Kort at repræsentere et en-til-mange forhold er forskelligt fra et Liste fordi vi har en nøgle.

Denne nøgle forvandler vores enhedsforhold til et ternær tilknytning, hvor hver nøgle henviser til en simpel værdi eller et indlejret objekt eller en enhed. På grund af dette at bruge en Kort, vi har altid brug for en sammenkædningstabel til at gemme den fremmede nøgle, der refererer til den overordnede enhed - nøglen og værdien.

Men denne sammenføjningstabel vil være lidt forskellig fra andre tilslutningstabeller i den den primære nøgle er ikke nødvendigvis fremmede nøgler til forældrene og målet. I stedet får vi den primære nøgle til at være en sammensætning af en fremmed nøgle til forældrene og en kolonne, der er nøglen til vores Kort.

Nøgleværdiparet i Kort kan være af to typer: Værditype og Enhedstype. I de følgende afsnit vil vi se på måderne til at repræsentere disse foreninger i dvale.

3. Brug @MapKeyColumn

Lad os sige, at vi har en Bestille enhed, og vi vil holde styr på navn og pris på alle varerne i en ordre. Så, vi vil introducere en Kort til Bestille som kortlægger varens navn til dets pris:

@Entity @Table (name = "orders") public class Order {@Id @GeneratedValue @Column (name = "id") privat int id; @ElementCollection @CollectionTable (name = "order_item_mapping", joinColumns = {@JoinColumn (name = "order_id", referencedColumnName = "id")}) @MapKeyColumn (name = "item_name") @Column (name = "pris") privat KortelementPriceMap; // standard getters og setter}

Vi er nødt til at angive i dvale, hvor nøglen og værdien skal hentes. For nøglen, vi har brugt @MapKeyKolonne, hvilket indikerer, at Kort'S nøgle er tingens navn kolonne i vores tilslutningstabel, order_item_mapping. Tilsvarende @Kolonne angiver, at Kort værdi svarer til pris kolonne i sammenføjningstabellen.

Også, itemPriceMap objekt er et værditypekort, så vi skal bruge @ElementCollection kommentar.

Ud over grundlæggende værditypeobjekter, @Kan integreres genstande kan også bruges som Kort'S værdier på en lignende måde.

4. Brug @MapKey

Som vi alle ved, ændres kravene over tid - så lad os nu sige, at vi skal gemme nogle flere attributter til Vare sammen med tingens navn og varePris:

@Entity @Table (name = "item") public class Element {@Id @GeneratedValue @Column (name = "id") privat int id; @Column (name = "name") privat streng elementnavn; @Kolonne (navn = "pris") privat dobbelt varePris; @Column (name = "item_type") @Enumerated (EnumType.STRING) private ItemType itemType; @Temporal (TemporalType.TIMESTAMP) @Column (name = "created_on") privat Dato oprettet On; // standard getters og setter}

Lad os derfor ændre os Kort til Kort i Bestille enhedsklasse:

@Entity @Table (name = "orders") public class Order {@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", referencedColumnName = "id")}) @MapKey (name = "itemName") privat Map itemMap; }

Bemærk, at denne gang bruger vi @MapKey kommentar, så Dvaletilstand vil bruge Vare#tingens navn som kortnøglekolonnen i stedet for at introducere en ekstra kolonne i sammenføjningstabellen. Så i dette tilfælde sammenføjningsbordet order_item_mappinghar ikke en nøglekolonne - i stedet henviser det til jegtem'S navn.

Dette er i modsætning til @MapKeyColumn. Hvornår vi bruger @MapKeyColumn, kortnøglen findes i sammenføjningstabellen. Dette er grunden til det vi kan ikke definere vores kortlægning af enheder ved hjælp af begge kommentarerne sammen.

Også, itemMap er et enhedstypekort, derfor skal vi kommentere forholdet ved hjælp af @OneToMany eller @ManyToMany.

5. Brug @MapKeyEnumerated og @MapKeyTemporal

Når vi angiver et enum som Kort nøgle, vi bruger @MapKeyEnumerated. Tilsvarende for tidsmæssige værdier, @MapKeyTemporal anvendes. Adfærden svarer meget til standarden @Enumereret og @Temporal annoteringer henholdsvis.

Disse ligner som standard @MapKeyColumn i det en nøglekolonne oprettes i tilslutningstabellen. Hvis vi vil genbruge den værdi, der allerede er gemt i den vedvarende enhed, skal vi desuden markere feltet med @MapKey.

6. Brug @MapKeyJoinColumn

Lad os derefter sige, at vi også skal holde styr på sælgeren af ​​hver vare. En måde vi kan gøre dette på er at tilføje en Sælger enhed og binde det til vores Vare enhed:

@Entity @Table (name = "sælger") offentlig klasse Sælger {@Id @GeneratedValue @Column (name = "id") privat int id; @Kolonne (navn = "navn") privat streng sælgernavn; // standard getters og setter}
@Entity @Table (name = "item") public class Element {@Id @GeneratedValue @Column (name = "id") privat int id; @Column (name = "name") privat streng elementnavn; @Kolonne (navn = "pris") privat dobbelt varePris; @Column (name = "item_type") @Enumerated (EnumType.STRING) private ItemType itemType; @Temporal (TemporalType.TIMESTAMP) @Column (name = "created_on") privat Dato oprettet On; @ManyToOne (cascade = CascadeType.ALL) @JoinColumn (name = "seller_id") privat sælger sælger; // standard getters og setter}

Lad os i dette tilfælde antage, at vores brugssag er at gruppere alle Bestille'S Vares ved Sælger. Lad os derfor ændre Kort til Kort:

@Entity @Table (name = "orders") public class Order {@Id @GeneratedValue @Column (name = "id") privat int id; @OneToMany (cascade = CascadeType.ALL) @JoinTable (name = "order_item_mapping", joinColumns = {@JoinColumn (name = "order_id", referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumn (name = "item_id", referencedColumnName = "id")}) @MapKeyJoinColumn (name = "seller_id") privat Kort sælgerItemMap; // standard getters og setter}

Vi skal tilføje @MapKeyJoinColumn for at opnå dette, da denne kommentar gør det muligt for dvale at beholde sælger_id kolonne (kortnøglen) i sammenføjningstabellen order_item_mapping sammen med vare_id kolonne. Så når vi læser dataene fra databasen, kan vi udføre en GROUP BY betjening let.

7. Konklusion

I denne artikel lærte vi om de mange måder at fortsætte på Kort i dvale afhængigt af den nødvendige kortlægning.

Som altid kan kildekoden til denne vejledning findes over Github.