孙卫琴的《精通JPA与Hibernate》的读书笔记:映射Bag包(值类型的集合)

Bag集合中的对象不按特定方式排序,但是允许有重复对象。在Java集合API中并没有提供Bag接口,Hibernate允许在持久化类中用List来模拟Bag的行为。假定Customer对象的images集合中允许存放重复的照片文件名,可以把images属性定义为List类型:

private List<String> images=new ArrayList<String>();

在数据库中定义了一张IMAGES表,它的CUSTOMER_ID字段为参照CUSTOMERS表的外键,由于Customer对象允许有重复的照片文件名,因此应该在IMAGES表中定义一个代理主键ID。

孙卫琴的《精通JPA与Hibernate》的读书笔记:映射Bag包(值类型的集合)

以下是IMAGES表的DDL定义:

create table IMAGES(
   ID bigint not null,
   CUSTOMER_ID bigint not null,
   FILENAME varchar(15) not null,
   primary key (ID),
   foreign key (CUSTOMER_ID) references CUSTOMERS(ID)
);

在Customer类中,映射Customer类的images属性的代码如下:

@ElementCollection
@CollectionTable(name="IMAGES",
         joinColumns=@JoinColumn(name="CUSTOMER_ID"))
@Column(name="FILENAME")
@CollectionId(columns=@Column(name="ID"),
                type=@Type(type="long"),
                generator="increment")  
private List<String> images=new ArrayList<String>();

@CollectionId注解来自于org.hibernate.annotations包,指定IMAGES表的主键为ID,它的映射类型为“long”,它采用“increment”标识符生成策略。
孙卫琴的《精通JPA与Hibernate》的读书笔记:映射Bag包(值类型的集合)

上一篇:孙卫琴的《精通JPA与Hibernate》的读书笔记:FetchType.LAZY延迟检索策略


下一篇:孙卫琴的《精通JPA与Hibernate》的读书笔记:在程序中动态指定立即左外连接检索