我正试图弄清楚JPA中是否可能存在类似这种类型的元素集合嵌套?或者至少做这样的事情,不需要我声明一个新的单独的实体来保存内部集合。我见过@MapKeyColumn&CollectionTable与java映射,但我不确定这是否有助于解决。
@Table
@Entity
public class MyClass {
@Id
private int myid;
@ElementCollection
private Map<String, List<String>> mymap;
}
根据hibernate文档:
2.8.2.值类型集合
值类型的集合包括基本类型和可嵌入类型集合不能嵌套,并且在集合中使用时,不允许嵌入类型定义其他集合
对于值类型的集合,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;
}