Vedvarende kart med dvalemodus

1. Introduksjon

I dvalemodus kan vi representere en-til-mange-relasjoner i Java-bønnene våre ved å la et av våre felt være a Liste.

I denne raske opplæringen vil vi utforske forskjellige måter å gjøre dette på med Kart i stedet.

2. Karts er forskjellige fra Listes

Bruker en Kart å representere et en-til-mange forhold er forskjellig fra et Liste fordi vi har en nøkkel.

Denne nøkkelen gjør vårt enhetsforhold til et ternær tilknytning, der hver nøkkel refererer til en enkel verdi eller et innebygd objekt eller en enhet. På grunn av dette, å bruke en Kart, vil vi alltid trenge en sammenføyningstabell for å lagre den utenlandske nøkkelen som refererer til den overordnede enheten - nøkkelen og verdien.

Men dette sammenføyningstabellen vil være litt forskjellig fra andre sammenføyningstabeller i det primærnøkkelen vil ikke nødvendigvis være utenlandske nøkler til foreldrene og målet. I stedet har vi den primære nøkkelen som en sammensetning av en fremmed nøkkel til foreldrene og en kolonne som er nøkkelen til vår Kart.

Nøkkelverdiparet i Kart kan være av to typer: Verditype og Enhetstype. I de følgende avsnittene vil vi se på måtene å representere disse assosiasjonene i dvalemodus.

3. Bruke @MapKeyColumn

La oss si at vi har en Rekkefølge enhet, og vi vil holde rede på navn og pris på alle varene i en ordre. Så, vi ønsker å introdusere en Kart til Rekkefølge som vil tilordne varens navn til prisen:

@Entity @Table (name = "orders") public class Order {@Id @GeneratedValue @Column (name = "id") private int id; @ElementCollection @CollectionTable (name = "order_item_mapping", joinColumns = {@JoinColumn (name = "order_id", referatedColumnName = "id")}) @MapKeyColumn (name = "item_name") @Column (name = "price") private KartelementPriceMap; // standard getters og setters}

Vi må indikere i dvale hvor du får tak i nøkkelen og verdien. For nøkkelen, vi har brukt @MapKeyKolonne, som indikerer at Kart’S nøkkel er gjenstandsnavn kolonne på vårt sammenføyningstabell, order_item_mapping. På samme måte, @Kolonne angir at Kart verdien tilsvarer pris kolonne i sammenføyningstabellen.

Også, itemPriceMap objektet er et verditypekart, derfor må vi bruke @ElementCollection kommentar.

I tillegg til grunnleggende verditypeobjekter, @Innbyggbar gjenstander kan også brukes som KartSine verdier på en lignende måte.

4. Bruke @MapKey

Som vi alle vet, endres kravene over tid - så la oss si at vi må lagre noen flere attributter av Punkt sammen med gjenstandsnavn og varePris:

@Entity @Table (name = "item") public class Item {@Id @GeneratedValue @Column (name = "id") private int id; @Column (name = "name") privat streng elementnavn; @Column (name = "pris") privat dobbelt varePris; @Column (name = "item_type") @Enumerated (EnumType.STRING) private ItemType itemType; @Temporal (TemporalType.TIMESTAMP) @Column (name = "created_on") privat Dato opprettet På; // standard getters og setters}

La oss derfor endre oss Kart til Kart i Rekkefølge enhetsklasse:

@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", referatedColumnName = "id")}, inverseJoinColumn = {@JoinColumn (name = "item_id", referertColumnName = "id")}) @MapKey (name = "itemName") privat Kart itemMap; }

Merk at denne gangen bruker vi @MapKey kommentar slik at dvalemodus vil bruke Punkt#gjenstandsnavn som kartnøkkelkolonnen i stedet for å introdusere en ekstra kolonne i sammenføyningstabellen. Så i dette tilfellet, sammenføyningsbordet order_item_mappinghar ikke en nøkkelkolonne - i stedet refererer det til Jegtem‘S navn.

Dette står i kontrast til @MapKeyColumn. Når vi bruker @MapKeyColumn, kartnøkkelen ligger i sammenføyningstabellen. Dette er grunnen til at vi kan ikke definere enhetskartleggingen vår ved å bruke begge kommentarene sammen.

Også, itemMap er et enhetstypekart, derfor må vi kommentere forholdet ved hjelp av @OneToMany eller @ManyToMany.

5. Bruke @MapKeyEnumerated og @MapKeyTemporal

Hver gang vi spesifiserer en enum som Kart nøkkel, bruker vi @MapKeyEnumerated. Tilsvarende for tidsverdier, @MapKeyTemporal benyttes. Oppførselen er ganske lik standarden @Nummerert og @Temporal merknader henholdsvis.

Som standard ligner disse på @MapKeyColumn i det en nøkkelkolonne blir opprettet i sammenføyningstabellen. Hvis vi ønsker å gjenbruke verdien som allerede er lagret i den vedvarende enheten, bør vi i tillegg merke feltet med @MapKey.

6. Bruke @MapKeyJoinColumn

La oss si at vi også må holde oversikt over selgeren av hvert element. En måte vi kan gjøre dette på er å legge til et Selger enhet og knytte det til vår Punkt enhet:

@Entity @Table (name = "seller") offentlig klasse selger {@Id @GeneratedValue @Column (name = "id") privat int id; @Column (name = "name") privat streng selgernavn; // standard getters og setters}
@Entity @Table (name = "item") public class Item {@Id @GeneratedValue @Column (name = "id") private int id; @Column (name = "name") privat streng elementnavn; @Column (name = "pris") privat dobbelt varePris; @Column (name = "item_type") @Enumerated (EnumType.STRING) private ItemType itemType; @Temporal (TemporalType.TIMESTAMP) @Column (name = "created_on") privat Dato opprettet På; @ManyToOne (cascade = CascadeType.ALL) @JoinColumn (name = "seller_id") privat selger selger; // standard getters og setters}

La oss i dette tilfellet anta at brukssaken er å gruppere alle Rekkefølge‘S Punkts av Selger. Derfor, la oss endre Kart til Kart:

@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", referatedColumnName = "id")}, inverseJoinColumn = {@JoinColumn (name = "item_id", referertColumnName = "id")}) @MapKeyJoinColumn (name = "seller_id") private Map sellerItemMap; // standard getters og setters}

Vi må legge til @MapKeyJoinColumn for å oppnå dette siden den merknaden lar dvalemodus beholde selger_id kolonne (kartnøkkelen) i sammenføyningstabellen order_item_mapping sammen med element_id kolonne. Så da, når vi leser dataene fra databasen, kan vi utføre en GRUPPE AV betjening enkelt.

7. Konklusjon

I denne artikkelen lærte vi om flere måter å vedvare på Kart i dvalemodus, avhengig av den nødvendige kartleggingen.

Som alltid kan kildekoden til denne opplæringen bli funnet over Github.


$config[zx-auto] not found$config[zx-overlay] not found