Lijst met collecties

Nou, je hebt gezien hoe je eenvoudige typen in kaart kunt brengen. Nu is het tijd om verder te gaan met interessantere vragen - hoe verzamelingen objecten in kaart te brengen.

En we kunnen objecten in 5 groepen hebben:

  • Array - een reeks objecten
  • Lijst - lijst met objecten
  • Set - set objecten
  • Kaart - een woordenboek van objecten
  • Collectie - een verzameling objecten

En een voorbeeld van een klasse met een verzamelveld:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @magical-annotation
   public List messages;
}

Dus wat is deze magische annotatie waarmee we niet één veld, maar veel waarden kunnen opslaan?

Deze annotatie wordt @ElementCollection genoemd . Voorbeeld:

@Entity
@Table(name="user")
class User  {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   public List<String> messages;
}

Het is heel eenvoudig geschreven, maar het werkt niet triviaal.

Hulptabel

Alle velden van de Entity-klasse die veel elementen bevatten en zijn gemarkeerd met de @ElementCollection- annotatie , bevinden zich in de database in een speciale hulptabel. Wat eigenlijk ook logisch is.

Deze tabel kan gegevens in twee vormen bevatten:

  • Geordend (Lijst, Kaart) bevat drie kolommen:
    • Sleutelkolom (vreemde sleutel) – verwijzing naar de ID van het bovenliggende object.
    • Indexkolom - positie/index in de collectie.
    • Element Kolom - waarde.
  • Unordered (Set) bevat twee kolommen:
    • Sleutelkolom (vreemde sleutel) – verwijzing naar de ID van het bovenliggende object.
    • Element Kolom - waarde.

U kunt de naam van deze tabel ook expliciet instellen met behulp van een annotatie:

@CollectionTable(name="table_name")

Voorbeeld:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   @CollectionTable(name="user_message")
   public List<String> messages;
}

Belangrijk! Als de annotatie @CollectionTable niet is opgegeven, bouwt Hibernate de tabelnaam zelf op op basis van de klassenaam en de veldnaam: de gebruikersklasse en het veldberichtennoem de tabel "User_messages".

Collectie Collectie

Maar laten we het maken van de hulptabel niet overlaten aan Hibernate en deze zelf maken. Eerst moeten we een tabel maken met twee kolommen:

CREATE TABLE user_message {
    user_id INT,
    message VARCHAR(255)
};

Merk op dat deze tabel geen eigen id-kolom heeft. Dit is het belangrijkste kenmerk van hulptabellen. Even later maak je kennis met andere soorten hulptabellen.

Nu moeten we deze tabel toewijzen aan ons veldberichtenin de gebruikersklasse . Dit ziet er als volgt uit:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   @CollectionTable(name="user_message", joinColumns = @JoinColumn(name = "user_id"))
   @Column(name = "message")
   public Set<String> messages;
}

Hier is het de moeite waard om op twee dingen te letten.

Ten eerste staat de berichtkolom, gespecificeerd met de @Column(name = "message") annotatie , in de user_message hulptabel, niet in de gebruikerstabel.

Ten tweede hebben we in de @JoinColumn(name = "user_id") annotatie de naam gespecificeerd van de user_id kolom, die verwijst naar de id van de gebruikerstabel. Dit is zodat Hibernate weet hoe ze correct moeten worden gecombineerd.

Verzameling

Als je de geordende elementen van een lijst of array in een hulptabel wilt opslaan, heb je een tabel met drie kolommen nodig:

CREATE TABLE user_message {
    user_id INT,
    index INT,
    message VARCHAR(255)
};

Als de kolomnaam "index" u niet bevalt, of u kunt deze niet wijzigen, kunt u tijdens het mappen een andere naam opgeven. Om dit te doen, moet u de annotatie @Index gebruiken .

Voorbeeld:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   @CollectionTable(name="user_message",
       	indexes = { @Index(columnList = "list_index") }
       	joinColumns = @JoinColumn(name = "user_id"))
   @Column(name = "message")
   public List<String> messages;
}

Kaart collectie

En tot slot, je wilt niet alleen een verzameling opslaan, maar ook een HashMap, en daarvoor heb je twee kolommen in een hulptabel nodig:

CREATE TABLE user_message {
    user_id INT,
    key VARCHAR(255),
    message VARCHAR(255)
};

Om een ​​sleutel voor een kaart op te geven, hebt u de annotatie @MapKeyColumn nodig .

Voorbeeld:

@Entity
@Table(name="user")
class User {
   @Id
   @Column(name="id")
   public Integer id;

   @ElementCollection
   @CollectionTable(name="user_message", joinColumns = @JoinColumn(name = "user_id"))
   @MapKeyColumn(name = "key")
   @Column(name = "message")
   public Map<String, String> messages;
}

Meer informatie vindt u in de officiële documentatie .