Aanhoudende kaarten met slaapstand

1. Inleiding

In Hibernate kunnen we een-op-veel-relaties in onze Java-bonen weergeven door een van onze velden een Lijst.

In deze korte tutorial onderzoeken we verschillende manieren om dit te doen met een Kaart in plaats daarvan.

2. Kaarts zijn anders dan Lijsts

Gebruik maken van een Kaart een een-op-veel-relatie vertegenwoordigen is iets anders dan een Lijst omdat we een sleutel hebben.

Deze sleutel verandert onze entiteitsrelatie in een ternair associatie, waarbij elke sleutel verwijst naar een eenvoudige waarde of een in te sluiten object of een entiteit. Daarom om een Kaart, we hebben altijd nodig een join-tabel om de externe sleutel op te slaan die verwijst naar de bovenliggende entiteit - de sleutel en de waarde.

Maar deze join-tafel zal daarin een beetje verschillen van andere join-tafels de primaire sleutel hoeft niet noodzakelijkerwijs externe sleutels te zijn voor de ouder en het doel. In plaats daarvan hebben we de primaire sleutel die een samenstelling is van een externe sleutel voor de ouder en een kolom die de sleutel is voor onze Kaart.

Het sleutel / waarde-paar in het Kaart kan van twee typen zijn: Waardetype en Entiteitstype. In de volgende secties zullen we kijken naar de manieren om deze associaties in Hibernate weer te geven.

3. Met behulp van @MapKeyColumn

Laten we zeggen dat we een Bestellen entiteit en we willen de naam en prijs bijhouden van alle items in een bestelling. Zo, we willen een Kaart naar Bestellen waarmee de naam van het item wordt toegewezen aan de prijs:

@Entity @Table (name = "orders") openbare klasse Order {@Id @GeneratedValue @Column (name = "id") privé int id; @ElementCollection @CollectionTable (name = "order_item_mapping", joinColumns = {@JoinColumn (name = "order_id", referencedColumnName = "id")}) @MapKeyColumn (name = "item_name") @Column (name = "price") privé KaartitemPriceMap; // standaard getters en setters}

We moeten aan Hibernate aangeven waar we de sleutel en de waarde kunnen krijgen. Voor de sleutel, we hebben @ gebruiktMapKeyKolom, wat aangeeft dat de KaartDe sleutel is de Itemnaam kolom van onze gezamenlijke tafel, order_item_mapping. Evenzo @Kolom specificeert dat de Kaart's waarde komt overeen met de prijs kolom van de join-tafel.

Ook, itemPriceMap object is een waardetypekaart, dus moeten we de @ElementCollection annotatie.

Naast objecten van het basiswaardetype, @Insluitbaar objecten kunnen ook worden gebruikt als de Kaart‘S waarden op een vergelijkbare manier.

4. Met behulp van @MapKey

Zoals we allemaal weten, veranderen de vereisten in de loop van de tijd, dus laten we zeggen dat we wat meer attributen van Item samen met Itemnaam en stuksprijs:

@Entity @Table (name = "item") openbare klasse Item {@Id @GeneratedValue @Column (name = "id") privé int id; @Column (name = "name") private String itemName; @Column (name = "price") privé dubbel itemPrice; @Column (name = "item_type") @Enumerated (EnumType.STRING) privé ItemType itemType; @Temporal (TemporalType.TIMESTAMP) @Column (name = "created_on") privé AanmaakdatumOp; // standaard getters en setters}

Laten we daarom veranderen Kaart naar Kaart in de Bestellen entiteitsklasse:

@Entity @Table (name = "orders") openbare klasse Order {@Id @GeneratedValue @Column (name = "id") privé int id; @OneToMany (cascade = CascadeType.ALL) @JoinTable (name = "order_item_mapping", joinColumns = {@JoinColumn (name = "order_id", referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumns = {@JoinColumn ", referencedColumnName = "id")}) @MapKey (name = "itemName") privékaart itemMap; }

Merk op dat we deze keer de @MapKey annotatie zodat Hibernate Item#Itemnaam als de kaartsleutelkolom in plaats van een extra kolom in de samenvoegtabel te introduceren. Dus in dit geval de aanschuiven tafel order_item_mappingheeft geen sleutelkolom - in plaats daarvan verwijst het naar de iktem‘S naam.

Dit is in tegenstelling tot @MapKeyColumn. Wanneer we gebruiken @MapKeyColumn, de map key bevindt zich in de join-tafel. Dit is de reden waarom we kunnen onze entiteitstoewijzing niet definiëren door beide annotaties samen te gebruiken.

Ook, itemMap is een entiteitstypekaart, daarom moeten we de relatie annoteren met @Een te veel of @Veel te veel.

5. Met behulp van @MapKeyEnumerated en @MapKeyTemporal

Telkens wanneer we een enum specificeren als de Kaart sleutel gebruiken we @MapKeyEnumerated. Evenzo, voor tijdelijke waarden, @MapKeyTemporal is gebruikt. Het gedrag is vrij gelijkaardig aan de standaard @Genummerd en @Tijdelijk annotaties.

Deze zijn standaard vergelijkbaar met @MapKeyColumn in dat er wordt een sleutelkolom gemaakt in de join-tafel. Als we de waarde die al is opgeslagen in de persistente entiteit opnieuw willen gebruiken, moeten we het veld bovendien markeren met @MapKey.

6. Met behulp van @RTLnieuws

Laten we vervolgens zeggen dat we ook de verkoper van elk item moeten bijhouden. Een manier waarop we dit kunnen doen, is door een Verkoper entiteit en koppel dat aan ons Item entiteit:

@Entity @Table (naam = "verkoper") openbare klasse Verkoper {@Id @GeneratedValue @Column (naam = "id") privé int id; @Column (name = "name") private String sellerName; // standaard getters en setters}
@Entity @Table (name = "item") openbare klasse Item {@Id @GeneratedValue @Column (name = "id") privé int id; @Column (name = "name") private String itemName; @Column (name = "price") privé dubbel itemPrice; @Column (name = "item_type") @Enumerated (EnumType.STRING) privé ItemType itemType; @Temporal (TemporalType.TIMESTAMP) @Column (name = "created_on") privé AanmaakdatumOp; @ManyToOne (cascade = CascadeType.ALL) @JoinColumn (naam = "seller_id") privéverkoper verkoper; // standaard getters en setters}

Laten we in dit geval aannemen dat onze use-case is om alles te groeperen Bestellen‘S Items door Verkoper. Laten we daarom veranderen Kaart naar Kaart:

@Entity @Table (name = "orders") openbare klasse Order {@Id @GeneratedValue @Column (name = "id") privé int id; @OneToMany (cascade = CascadeType.ALL) @JoinTable (name = "order_item_mapping", joinColumns = {@JoinColumn (name = "order_id", referencedColumnName = "id")}, inverseJoinColumns = {@JoinColumns = {@JoinColumn ", referencedColumnName = "id")}) @MapKeyJoinColumn (name = "seller_id") privékaart sellerItemMap; // standaard getters en setters}

We moeten toevoegen @RTLnieuws om dit te bereiken, aangezien die annotatie Hibernate toestaat de verkoper_id kolom (de kaartsleutel) in de samenvoegtabel order_item_mapping samen met de item ID kolom. Dus op het moment dat we de gegevens uit de database lezen, kunnen we een GROEP OP bediening gemakkelijk.

7. Conclusie

In dit artikel hebben we geleerd over de verschillende manieren om vol te houden Kaart in Slaapstand, afhankelijk van de vereiste toewijzing.

Zoals altijd is de broncode van deze tutorial te vinden op Github.


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