实体关系映射
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 : 执行删除操作时级联
943

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



