Hibernate_一对多映射_2
单向多对一关联:在many方的实体中添加保存one方的引用,
在many方的配置文件中添加<many-to-one>配置
·多对一的关系和关系数据库中的外键参照关系最匹配,即在己方的表中的一个外键参照另一个表的主键
·通过在多方持有一方的引用实现,需要在“多”端的一端使用<many to one> 配置
<class name="com.imooc.entity.Student" table="student">
<id name="sid" column="sid" type="java.lang.Integer">
<generator class="increment"></generator>
</id>
<property name="sname" type="java.lang.String">
<column name="sname" length="20" not-null="true"></column>
</property>
<property name="sex">
<column name="sex"></column>
</property>
<!-- 配置多对一关联关系 -->
<many-to-one name="grade" class="com.imooc.entity.Grade" column="gid" cascade="all"></many-to-one>
</class>
//保存
public static void save(){
Grade g=new Grade("Java一班","Java软件开发一班");
Student stu1=new Student("慕女神", "女");
Student stu2=new Student("小慕慕", "男");
//设置关联关系
stu1.setGrade(g);
stu2.setGrade(g);
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
session.save(g);
session.save(stu1);
session.save(stu2);
tx.commit();
HibernateUtil.closeSession(session);
}
===双向多对一测试=========================
配置了双向关系以后,既可以从多方查找one 方信息,也可从one方查找多方信息,非常方便
多方:
<hibernate-mapping>
<class name="com.imooc.entity.Student" table="student">
<id name="sid" column="sid" type="java.lang.Integer">
<generator class="increment"></generator>
</id>
<property name="sname" type="java.lang.String">
<column name="sname" length="20" not-null="true"></column>
</property>
<property name="sex">
<column name="sex"></column>
</property>
<!-- 配置多对一关联关系 -->
<many-to-one name="grade" class="com.imooc.entity.Grade" column="gid"></many-to-one>
</class>
ONE方:
<hibernate-mapping>
<class name="com.imooc.entity.Grade" table="grade">
<id name="gid" column="gid" type="java.lang.Integer">
<generator class="increment"></generator>
</id>
<property name="gname" type="java.lang.String">
<column name="gname" length="20" not-null="true"></column>
</property>
<property name="gdesc">
<column name="gdesc"></column>
</property>
<!-- 配置一对多关联关系 -->
<set name="students" table="student">
<key column="gid"></key>
<one-to-many class="com.imooc.entity.Student"/>
</set>
</class>
//保存
public static void save(){
Grade g=new Grade("Java一班","Java软件开发一班");
Student stu1=new Student("慕女神", "女");
Student stu2=new Student("小慕慕", "男");
//设置关联关系
g.getStudents().add(stu1);
g.getStudents().add(stu2);
stu1.setGrade(g);
stu2.setGrade(g);
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
session.save(g);
session.save(stu1);
session.save(stu2);
tx.commit();
HibernateUtil.closeSession(session);
}
===inverse属性=====================================
inverse美 [ˌɪnˈvɜ:rs] adj. 相反的;逆向的 n. 相反;倒转;vt. 使倒转;使颠倒
<set>节点的inverse属性指定关联关系的控制方向,默认由one方来维护
关联关系中,inverse="false",则为主动方,由主动方负责维护关联关系
在一对多关联中,只能设置One方的inverse="true",由多方负责维护关联关系,有助于性能改善(避免双方重复维护)
多方:
<!-- 配置一对多关联关系 设置inverse属性为true,由多方负责维护关联关系-->
<set name="students" table="student" inverse="true">
<key column="gid"></key>
<one-to-many class="com.imooc.entity.Student"/>
</set>
===cascade属性:设置级联关系=====================================
cascade美 [kæˈsked] n.串联;倾泻;小瀑布,瀑布状物 vi. 流注;大量落下
·当设置了cascade属性不为none时,Hibernate会自动持久化所关联的对象
cascade属性的设置会带来性能上的变动,需谨慎设置
属性值 : 含义和作用
all 对所有操作进行级联操作
save-update 执行保存和更新操作时进行级联操作
delete 执行删除操作时操作时进行级联操作
none 对所有操作不进行级联操作
//保存
public static void save(){
Grade g=new Grade("Java一班","Java软件开发一班");
Student stu1=new Student("慕女神", "女");
Student stu2=new Student("小慕慕", "男");
//设置关联关系
g.getStudents().add(stu1);
g.getStudents().add(stu2);
stu1.setGrade(g);
stu2.setGrade(g);
Session session=HibernateUtil.getSession();
Transaction tx=session.beginTransaction();
session.save(g);//级联操作
//session.save(stu1);
//session.save(stu2);
<!-- 配置一对多关联关系 设置inverse属性为true,由多方负责维护关联关系-->
<set name="students" table="student" inverse="true" cascade="save-update">
<key column="gid"></key>
<one-to-many class="com.imooc.entity.Student"/>
</set>
例子:也可在学生端级联
//session.save(g);//级联操作
session.save(stu1);
session.save(stu2);
多many方:
<!-- 配置多对一关联关系 -->
<many-to-one name="grade" class="com.imooc.entity.Grade" column="gid" cascade= "all"></many-to-one>
</class>
=========================
MyEclipse 给工程添加hibernate支持
菜单Windws-->Show-->View-->Other,展开MyEclipse Datebase 选择DB Browser(数据库视图)
左侧空白右击,New-->DatebaseDriver 选择相应数据库 给连接命名,指定DB URl-->user /password-->
Driver JARs :点击Add JARS 选择JAR包
可点击Test Driver
可勾选save password
-------------------------
MyEclipse 添加hibernate支持
工程-右击-MyEclipse->Add Hibernate Capabilities:
选择Hibernate版本(MyEclipse版本越高,支持的Hibernate版本也越高,尽量选择新版本)
根据需要选择相应的JAR包::(1)添加JAR包
next-->创建hibernate.cfg.xml(指定目录) :(2)添加核心配置文件
next-->选择数据库连接
next-->创建Hibernate工具类,用于获取session或者sessionFactory(Java package 新建) :(3)添加工具类
finish
-------------------------
MyEclipse 反向工程:根据数据库中的表 自动创建持久化类和映射文件文件
1)创建包entity 用于保存持久化类
2)数据库视图 CTRL 选择复数表-右击-Hibernate Reverse Engineering(反向工程)
指定Java src folder目录
指定持久化类和映射文件保存位置,
勾选Create POJO<>DB Table mapping information创建映射文件
(勾选create a Hibernate mapping file (*.hbm.xml)for each datebase table)
(勾选Update Hibernate configuration with mapping resource location)
勾选Java Date Object (POJO<> DB Table) :创建实体类
注意:Create abstract class 不勾选(不需要)
NEXT ->Hibernate Mapping and Application Generation :
Id Generator:选择主键生成策略(例子中是increment)
NEXT->选择表 勾选:Include referenced tables(A->B),Include referenced tables(A<-B)
finish.切换回企业开发视图