Listahan ng mga koleksyon

Well, nakita mo na kung paano mag-map ng mga simpleng uri. Ngayon ay oras na upang lumipat sa mas kawili-wiling mga tanong - kung paano i-map ang mga koleksyon ng mga bagay.

At maaari tayong magkaroon ng mga bagay sa 5 pangkat:

  • Array - isang hanay ng mga bagay
  • Listahan - listahan ng mga bagay
  • Set - set ng mga bagay
  • Mapa - isang diksyunaryo ng mga bagay
  • Koleksyon - isang koleksyon ng mga bagay

At isang halimbawa ng isang klase na may field ng koleksyon:

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

   @magical-annotation
   public List messages;
}

Kaya ano ang mahiwagang anotasyon na ito na magpapahintulot sa amin na mag-imbak ng hindi isang field, ngunit maraming mga halaga?

Ang anotasyong ito ay tinatawag na @ElementCollection . Halimbawa:

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

   @ElementCollection
   public List<String> messages;
}

Ito ay isinulat nang napakasimple, ngunit ito ay gumagana nang walang kabuluhan.

Auxiliary table

Ang lahat ng field ng Entity class na naglalaman ng maraming elemento at minarkahan ng @ElementCollection annotation ay nakapaloob sa database sa isang espesyal na auxiliary table. Na, sa katunayan, ay lohikal.

Ang talahanayang ito ay maaaring maglaman ng data sa dalawang anyo:

  • Ang Ordered (Listahan, Mapa) ay naglalaman ng tatlong column:
    • Key Column (Foreign Key) – reference sa ID ng parent object.
    • Index Column - posisyon/index sa koleksyon.
    • Element Column - halaga.
  • Ang Unordered (Set) ay naglalaman ng dalawang column:
    • Key Column (Foreign Key) – reference sa ID ng parent object.
    • Element Column - halaga.

Maaari mo ring itakda ang pangalan ng talahanayang ito nang tahasan gamit ang isang anotasyon:

@CollectionTable(name="table_name")

Halimbawa:

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

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

Mahalaga! Kung hindi tinukoy ang @CollectionTable annotation , bubuuin ng Hibernate ang pangalan ng talahanayan mismo batay sa pangalan ng klase at pangalan ng field: ang klase ng User at ang fieldmga mensahepangalanan ang talahanayan na "User_messages".

Koleksyon ng Koleksyon

Ngunit huwag nating iwanan ang paglikha ng auxiliary table sa Hibernate at likhain ito mismo. Una kailangan nating lumikha ng isang talahanayan na may dalawang hanay:

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

Tandaan na ang talahanayang ito ay walang sariling id-column. Ito ang pangunahing tampok ng mga auxiliary table. Makikilala mo ang iba pang mga uri ng auxiliary table sa ibang pagkakataon.

Ngayon ay kailangan nating imapa ang talahanayang ito sa ating fieldmga mensahesa klase ng User . Magiging ganito ang hitsura nito:

@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;
}

Narito ito ay nagkakahalaga ng pagbibigay pansin sa dalawang bagay.

Una, ang column ng mensahe, na tinukoy sa @Column(name = "message") annotation , ay nasa auxiliary table ng user_message, hindi sa talahanayan ng user.

Pangalawa, sa @JoinColumn(name = "user_id") annotation , tinukoy namin ang pangalan ng column na user_id, na tumutukoy sa id ng talahanayan ng user. Ito ay upang malaman ng Hibernate kung paano pagsamahin ang mga ito nang tama.

Koleksyon

Kung gusto mong iimbak ang mga nakaayos na elemento ng isang listahan o array sa isang auxiliary table, kailangan mo ng table na may tatlong column:

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

Kung hindi mo gusto ang pangalan ng column na "index", o hindi mo ito mababago, maaari kang tumukoy ng ibang pangalan sa panahon ng pagmamapa. Upang gawin ito, kailangan mong gamitin ang @Index annotation .

Halimbawa:

@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;
}

Koleksyon ng mapa

At sa wakas, gusto mong mag-imbak hindi lamang ng isang koleksyon, ngunit isang HashMap, at kailangan mo ng dalawang column sa isang auxiliary table para dito:

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

Upang matukoy ang isang susi para sa isang Map, kailangan mo ang @MapKeyColumn annotation .

Halimbawa:

@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;
}

Makakahanap ka ng higit pang impormasyon sa opisyal na dokumentasyon .