- Hibernate集合映射Set篇
-
集合映射
我们通过一个具体示例看一下如何在Hibernate中使用集合映射。
例如:在一个购物网站中,需要有个用户表用来记录用户的基本信息,这张表包括用户的ID,姓名以及邮寄地址,但是有些人可能有多个邮寄地址,这时在数据库中我们需要使用另外一张表单独存储用户的邮寄信息,在这张表中使用UserId作为用户表的一个外键,从而实现两张表之间的关联。
这里我们使用Hibernate的自动建表机制,不在数据库中创建相应的数据表。
要实现自动建表需要在Hibernate.cfg.xml文件中添加如下属性
1<property
name
=
"hbm2ddl.auto"
>
update
</property>
首先创建用户类,用户类中有id属性,姓名属性和存放收货地址的属性,因为收货地址有多个所以不能使用String类型,所以考虑使用集合类型,因此创建具体类如下:
12345678910111213package entity;
import java.util.HashSet;
import java.util.
Set
;
public
class TUser{
private
int
id;
private String
name
;
private
Set
<String> userAddresses = new HashSet<String>();
//省略get/
set
方法
}
然后写TUser类的具体映射配置文件。
在Hibernate中要通过用户表中映射文件访问到集合表需要知道一下信息
1、 集合表的名称(表名称)
2、 集合表中的外键(集合外键)
3、 集合表中的元素列(集合元素)
然后看具体配置代码
1234567891011121314151617<hibernate-mapping>
<class
name
=
"entity.TUser"
table
=
"T_USER"
schema
=
"MYHR"
>
<id
name
=
"id"
type=
"int"
>
<
column
name
=
"ID"
precision
=
"22"
scale=
"0"
/>
<generator class=
"assigned"
/>
</id>
<property
name
=
"name"
type=
"string"
>
<
column
name
=
"NAME"
not
-
null
=
"true"
/>
</property>
<
set
name
=
"userAddresses"
table
=
"USER_ADDRESS"
>
<
key
>
<
column
name
=
"USERID"
not
-
null
=
"true"
/>
</
key
>
<element type=
"string"
column
=
"address"
></element>
</
set
>
</class>
</hibernate-mapping>
<set>标签用于指定集合映射,其name属性用于指定POJO类中Set类型数据属性名,table用于指定其关联的数据表。
<key>标签用于指定关联表的外键。<element>用于指定关联表中其他属性。
下面看一下测试代码
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748package Test;
import java.util.HashSet;
import java.util.
Set
;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.
Transaction
;
import entity.TUser;
import SessionFactory.HibernateSessionFactory;
public
class Test {
private Session session =
null
;
private
Transaction
tran =
null
;
@org.junit.Test
public
void test() {
Set
<String>
set
= new HashSet<String>();
set
.
add
(
"地址一"
);
set
.
add
(
"地址二"
);
session = HibernateSessionFactory.getSession();
tran = session.beginTransaction();
try {
TUser
user
= new TUser();
user
.setId(2);
user
.setName(
"张三"
);
user
.setUserAddresses(
set
);
session.save(
user
);
tran.
commit
();
} catch (Exception e) {
tran.
rollback
();
} finally {
HibernateSessionFactory.closeSession();
}
}
@org.junit.Test
public
void get() {
session = HibernateSessionFactory.getSession();
String hql =
"FROM TUser t where t.id=1"
;
Query query = session.createQuery(hql);
TUser
user
= (TUser) query.uniqueResult();
System.
out
.println(
user
.getName());
}
}
然后通过数据库查询即可查询到相应数据。
-