JPA Коллекция вложенных элементов - PullRequest
1 голос
/ 03 апреля 2020

Я пытаюсь выяснить, возможно ли что-то подобное вложению в коллекции элементов в JPA? Или, по крайней мере, делать что-то подобное, что не потребовало бы от меня объявить новый отдельный объект, который будет содержать внутреннюю коллекцию. Я видел использование @MapKeyColumn & @CollectionTable с java картами, но не уверен, что это поможет решить.

@Table
@Entity
public class MyClass {
   @Id
   private int myid;

   @ElementCollection
   private Map<String, List<String>> mymap;
}

1 Ответ

1 голос
/ 03 апреля 2020

В соответствии со спящей документацией :

2.8.2. Коллекции типов значений

Коллекции типов значений включают базовые c и встраиваемые типы. Коллекции не могут быть вложенными, и при использовании в коллекциях встраиваемые типы не могут определять другие коллекции.

Для коллекций типов значений JPA 2.0 определяет аннотацию @ElementCollection. Жизненный цикл коллекции типов значений полностью контролируется ее владельцем.

Итак, вы должны объявить промежуточный объект для решения вашей проблемы. Ниже вы можете увидеть простой пример.

  1. Схема базы данных:
create table MY_PATIENT
(
   PAT_RECID  number,
   PAT_NAME varchar2(100),

   constraint PAT_PK primary key(PAT_RECID)
);

create table MY_ORDER
(
   ORD_RECID  number,
   ORD_CODE varchar2(15),
   ORD_PATID number,

   constraint ORD_PK primary key(ORD_RECID),
   constraint ORD_PAT_FK foreign key(ORD_PATID) references MY_PATIENT(PAT_RECID),
   constraint ORD_CODE_UNIQUE unique (ORD_CODE)
);

create table MY_TEST
(
   TST_RECID  number,
   TST_CODE varchar2(20),
   TST_ORDID number,

   constraint TST_PK primary key(TST_RECID),
   constraint TST_ORD_FK foreign key(TST_ORDID) references MY_ORDER(ORD_RECID),
   constraint TST_CODE_UNIQUE unique (TST_CODE)
);
Соответствующее отображение спящего режима:
@Entity
@Table(name = "MY_PATIENT")
public class Patient
{
   @Id
   @Column(name = "PAT_RECID")
   private Long id;

   @Column(name = "PAT_NAME")
   private String name;

   @OneToMany(mappedBy = "patient")
   @MapKey(name = "code")
   private Map<String, Order> orders;
}

@Entity
@Table(name = "MY_ORDER")
public class Order
{
   @Id
   @Column(name = "ORD_RECID")
   private Long id;

   @Column(name = "ORD_CODE")
   private String code;

   @ManyToOne
   @JoinColumn(name = "ORD_PATID")
   private Patient patient;

   @ElementCollection
   @CollectionTable(name = "MY_TEST", joinColumns = {@JoinColumn(name = "TST_ORDID")})
   @Column(name = "TST_CODE")
   private List<String> tests;
}
...