实体关系映射
1
、One to one:一对一主键关联
两个表主键对应,插入一个表另一个表的主键相对应。
(1).
主表:
<1>.
使用Hibernate插入主键uuid.hex
<2>.
修改主表user.hbn.xml
<
one-to-one
name
=
"rose"
class
=
"db.Rose"
cascade
=
"all"
>
</
one-to-one
>
Name
:从表名
Class
:从表对应的类文件
Cascade
:控制及连操作
<3>.
在类文件中添加字段-对方的对象,并生成get、set方法
(2).
从表:
<1>.
使用按主表插入的主键来插入主键foreign
<2>.
修改从表rose.hbn.xml
<
one-to-one
name
=
"user"
class
=
"db.User"
constrained
=
"true"
> </
one-to-one
>
Name
:主表名
Class
:主表对应的类文件
Constrained
:是否要在表之间建立级联更新,它代表级联的顺序
<3>.
在类文件中添加字段-对方的对象,并生成get、set方法
(3).
测试类:
Rose rose =
new
Rose();
rose.setName(
"Student"
);
User user =
new
User();
user.setName(
"zhou"
);
rose.setUser(user);
user.setRose(rose);
Session session = HibernateSessionFactory.getSession();
Transaction tran = session.beginTransaction();
// session.save(user);
保存哪一个都没事,两个表都会相应的变化
session.save(rose);
tran.commit();
session.close();
2
、One to one和One to many:唯一外键关联
(1).
主表:
<1>.
使用Hibernate插入主键uuid.hex
<2>.
修改主表
user
.hbn.xml
<
one-to-one
name
=
"rose"
class
=
"db.Rose"
property-ref
=
"user"
cascade
=
"all"
>
</
one-to-one
>
Name
:从表名
Class
:从表对应的类文件
Property-ref
:主键的表名
Cascade
:控制及连接操作
<3>.
在类文件中添加字段-对方的对象,并生成get、set方法
(2).
从表:
<1>.
使用Hibernate插入主键uuid.hex
<2>.
修改从表rose.hbn.xml
<
many-to-one
name
=
"user"
class
=
"db.User"
column
=
"name"
unique
=
"true"
>
</
many-to-one
>
Name
:主表名
Class
:主表对应的类文件
Column
:外键字段
Unique
:级联操作
<3>.
在类文件中添加字段-对方的对象,并生成get、set方法
(3).
测试类:
User user =
new
User();
user.setName(
"zhou"
);
Rose rose =
new
Rose();
user.setRose(rose);
rose.setUser(user);
Session session=HibernateSessionFactory.getSession();
Transaction tran=session.beginTransaction();
session.save(user);//
保存主表
tran.commit();
session.close();
3
、One to many
Sql
语句先执行插入在执行修改所以效率低,不如换用Many to one,但是不用配置从表
(1).
主表:
<1>.
使用Hibernate插入主键uuid.hex
<2>.
修改主表user.hbn.xml
<
set
name
=
"roses"
cascade
=
"all"
table
=
"rose"
>
<
key
column
=
"userId"
></
key
>
<
one-to-many
class
=
"db.Rose"
/>
</
set
>
Name
:实现了HashSet的对象名
Cascade
:控制及连操作
Table
:从表明
Column
:外键字段
Class
:从表对应的类文件
<3>.
在类文件中添加字段-HashSet,并生成get、set方法
如:
private
Set
roses
=
new
HashSet();
(2).
测试类:
Rose rose1 =
new
Rose();
rose1.setName(
"Student"
);
Rose rose2 =
new
Rose();
rose2.setName(
"Teacher"
);
User user =
new
User();
user.setName(
"zhou"
);
user.getRoses().add(rose1);
user.getRoses().add(rose2);
Session session = HibernateSessionFactory.getSession();
Transaction tran = session.beginTransaction();
session.save(user);
tran.commit();
session.close();
4
、Many to one
Sql
语句直接执行,比Many to one效率几乎高一倍,但是必须配置从表
(1).
主表:
<1>.
使用Hibernate插入主键uuid.hex
<2>.
修改主表user.hbn.xml
<
set
name
=
"roses"
cascade
=
"all"
table
=
"rose"
inverse
=
"true"
>
<
key
column
=
"userid"
></
key
>
<
one-to-many
class
=
"db.Rose"
/>
</
set
>
Name
:实现了HashSet的对象名
Cascade
:控制及连操作
Table
:从表明
Inverse
:是“反转”的意思,表示关联关系的控制权
Column
:外键调用的字段
Class
:从表对应的类文件
<3>.
在类文件中添加字段-HashSet,并生成get、set方法
如:
private
Set
roses
=
new
HashSet();
(2).
从表:
<1>.
使用Hibernate插入主键uuid.hex
<2>.
修改从表rose.hbn.xml
<
many-to-one
name
=
"user"
class
=
"db.User"
column
=
"userid"
>
</
many-to-one
>
Name
:主表名
Class
:主表对应的类文件
Column
:调用主键的字段
<3>.
在类文件中添加字段-对方的对象,并生成get、set方法
(3).
测试类:
Rose rose1 =
new
Rose();
rose1.setName(
"Student"
);
Rose rose2 =
new
Rose();
rose2.setName(
"Teacher"
);
User user =
new
User();
user.setName(
"zhou"
);
user.getRoses().add(rose1);
user.getRoses().add(rose2);
rose1.setUser(user);
rose2.setUser(user);
Session session = HibernateSessionFactory.getSession();
Transaction trans = session.beginTransaction();
session.save(user);
trans.commit();
session.close();
5
、Many to many:一对一主键关联
两个表主键对应,插入一个表另一个表的主键相对应。
(1).
主表:
<1>.
使用Hibernate插入主键uuid.hex
<2>.
修改主表user.hbn.xml
<
set
name
=
"tgroupRoles"
table
=
"tgroup_role"
inverse
=
"true"
>
<
key
>
<
column
name
=
"role_id"
not-null
=
"true"
/>
</
key
>
<
many-to-many
class
=
"db.user"
column
=
" id"
/>
</
set
>
Name
:实现了HashSet的对象名,指的是中间表的集合
Table
:中间表名
Inverse
:反转
Name
:中间表的字段,是中间表的主键但是是主表的主键的一个外键
Class
:主表
Column
:主表的主键
<3>.
在类文件中添加字段-HashSet,并生成get、set方法
如:
private
Set
tgroupRoles
=
new
HashSet();
(中间表的集合)
(2).
从表:
<1>.
使用Hibernate插入主键uuid.hex
<2>.
修改从表rose.hbn.xml
<
set
name
=
"tgroupRoles"
table
=
"tgroup_role"
cascade
=
"save-update"
>
<
key
>
<
column
name
=
"group_id"
not-null
=
"true"
/>
</
key
>
<
many-to-many
class
=
"db.rose"
column
=
"id"
/>
</
set
>
Name
:实现了HashSet的对象名,指的是中间表的集合
Table
:中间表名
Cascade
:什么操作执行级联更新
Name
:中间表的字段,是中间表的主键但是是主表的主键的一个外键
Class
:主表
Column
:主表的主键
<3>.
在类文件中添加字段-HashSet,并生成get、set方法
如:
private
Set
tgroupRoles
=
new
HashSet();
(中间表的集合)
(3).
测试类:
Trole role1 =
new
Trole();
role1.setName(
"Role1"
);
Trole role2 =
new
Trole();
role2.setName(
"Role2"
);
Trole role3 =
new
Trole();
role3.setName(
"Role3"
);
Tgroup group1 =
new
Tgroup();
group1.setName(
"group1"
);
Tgroup group2 =
new
Tgroup();
group2.setName(
"group2"
);
Tgroup group3 =
new
Tgroup();
group3.setName(
"group3"
);
group1.getTgroupRoles().add(role1);
group1.getTgroupRoles().add(role2);
group2.getTgroupRoles().add(role2);
group2.getTgroupRoles().add(role3);
group3.getTgroupRoles().add(role1);
group3.getTgroupRoles().add(role3);
role1.getTgroupRoles().add(group1);
role1.getTgroupRoles().add(group3);
role2.getTgroupRoles().add(group1);
role2.getTgroupRoles().add(group2);
role3.getTgroupRoles().add(group2);
role3.getTgroupRoles().add(group3);
Session session = HibernateSessionFactory.getSession();
Transaction trans = session.beginTransaction();
session.save(role1);
session.save(role2);
session.save(role3);
session.save(group1);
session.save(group2);
session.save(group3);
trans.commit();
session.close();
注释:
1
、
inverse
属性,
inverse
是
“
反转
”
的意思,表示关联关系的控制权。
true
,表示由对方负责关联关系的添加和删除;
false
,表示由自己负责维护关联关系。
2
、
cascade
属性
all :
对所有操作都进行级联
none :
对所有操作都不进行级联
save-update :
执行更新操作时级联
delete :
执行删除操作时级联