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

  • 相关阅读:
    Day08_固化命令、grep、sed及awk命令
    Day07_网络管理、SSH、shell及元字符
    Day06_nginx及反向代理、共享存储nfs
    安装Apache所踩的的坑
    使用JS制作小游戏贪吃蛇
    清除浮动的几种方式
    纯CSS3图片反转
    在JAVASCRIPT中,为什么document.getElementById不可以再全局(函数外)使用?
    关于钉钉开发,心得
    javascript计算两个时间差
  • 原文地址:https://www.cnblogs.com/charles999/p/6606032.html
Copyright © 2020-2023  润新知