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。
以下是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”标识符生成策略。