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

使用Hibernate模拟Java中的Bag集合行为
这篇博客讨论了如何在Java中使用Hibernate来模拟Bag集合的行为,Bag集合允许对象重复且不排序。通过在持久化类中定义一个List属性并映射到数据库的IMAGES表,可以实现这个功能。IMAGES表有一个代理主键ID和外键参照CUSTOMERS表。在映射代码中,使用了@ElementCollection、@CollectionTable、@CollectionId等注解来定义外键关联和主键生成策略。
1088

被折叠的 条评论
为什么被折叠?



