В соответствии со спящей документацией :
2.8.2. Коллекции типов значений
Коллекции типов значений включают базовые c и встраиваемые типы. Коллекции не могут быть вложенными, и при использовании в коллекциях встраиваемые типы не могут определять другие коллекции.
Для коллекций типов значений JPA 2.0 определяет аннотацию @ElementCollection
. Жизненный цикл коллекции типов значений полностью контролируется ее владельцем.
Итак, вы должны объявить промежуточный объект для решения вашей проблемы. Ниже вы можете увидеть простой пример.
- Схема базы данных:
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;
}