Pull to refresh

Java EE 6. Обзор JPA 2.0, часть 2: Коллекции

Reading time 3 min
Views 24K


image

Продолжение серии. Ранее: Java EE 6. Обзор JPA 2.0, часть 1: Введение. В данной статье я продолжаю рассматривать изменения в JPA.

Встроенные коллекции

Введенный в JPA 2.0 компонент ElementCollection позволяет задавать политики отображения для необычных в JPA 1.0 видов коллекций: коллекций embeddable объектов, либо коллекций «простых» типов (Integer, String и т.д.). Также это компонент используется при в определениях отношений с Map, в роли ключа которого выступают любого рода объекты, а в роли значения — embeddable или «простые» объекты.

Значения ElementCollection всегда хранятся в отдельных таблицах, которые задаются аннотацией @CollectionTable. CollectionTable отпределяет имя таблицы и @JoinColumn или @JoinColumns в случае составного первичного ключа.

Коллекции embedded объектов

Для определения коллекции embedded объектов используется ElementCollection. Декларирование отображения embedded похоже на OneToMany, за исключением того, что целевая таблица является Embeddable, а не сущностью. Это позволяет проще объявлять коллекции простых объектов, без необходимости определения обратных связей и внесения Id.

Отличием ElementCollection от OneToMany служит то, что целевые объекты нельзя выбирать, сохранять, мержить напрямую, не зависимо от родительского объекта. Отсутстсвует политика каскадирования, состояние объектов коллекции синхронно состоянию родительского объекта. Ну в общем то все как и с embedded объектами. Однако у ElementCollection можно задавать тип выборки, и по умолчанию он lazy.

Пришло время небольшого примера:
  1. import javax.persistence.*;
  2. import java.util.List;
  3.  
  4.  
  5. @Entity
  6. public class Customer {
  7.   @Id
  8.   @Column(name="CUSTOMER_ID")
  9.   private Long id;
  10.  
  11.   private String name;
  12.  
  13.   @ElementCollection
  14.   @CollectionTable(
  15.     name="CUST_ADDRESS",
  16.     joinColumns=@JoinColumn(name="OWNER_ID")
  17.   )
  18.   private List<Address> phones;
  19.  
  20.   //:~ Дальше идут акцессоры
  21. }


  1. import javax.persistence.Column;
  2. import javax.persistence.Embeddable;
  3.  
  4.  
  5. @Embeddable
  6. public class Address {
  7.  
  8.   private String city;
  9.  
  10.   private String street;
  11.  
  12.   @Column(name="ZIP_CODE")
  13.   private String zip;
  14.  
  15.   //:~ Дальше идут акцессоры
  16. }


На выходе получится следующая схема в БД:
image

Коллекции из объектов «простых» типов

С простыми коллекциями все также просто: используется ElementCollection, для значений создается отдельная таблица, все аналогично OneToMany за исключением того, что целевой обект является простым, а не сущностью. Минусы этого подхода аналогичны перечисленным в пердыдущем пункте.

Самое время для примера:
  1. import javax.persistence.*;
  2. import java.util.List;
  3.  
  4.  
  5. @Entity
  6. public class Customer {
  7.   @Id
  8.   @Column(name="CUSTOMER_ID")
  9.   private long id;
  10.  
  11.   private String name;
  12.  
  13.   @ElementCollection
  14.   @CollectionTable(
  15.     name="CUST_ADDRESSES",
  16.     joinColumns=@JoinColumn(name="OWNER_ID")
  17.   )
  18.   @Column(name="ADDRESS")
  19.   private List<String> address;
  20.  
  21.  
  22.   //:~ Дальше идут акцессоры
  23.  
  24. }


На выходе получится следующая схема в БД:
image
Tags:
Hubs:
+19
Comments 2
Comments Comments 2

Articles