实体关系映射

 
实体关系映射
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 : 执行删除操作时级联
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值