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.切换回企业开发视图

 

posted @ 2017-03-23 16:55  charles999  阅读(94)  评论(0编辑  收藏  举报