• hibernate关联映射有关属性


    问题:如何实现添加部门的同时自动添加员工?

     cascade属性

    解析:可以使用cascade(级联)方式

    Cascade取值:

       None,save-update,delete和all

       none:当Session操纵当前对象时,忽略其他关联的对象。它是cascade属性的默认值.

      Save-update:当通过Session的save()、update()及saveOrUpdate()方法来保存或更新当前对象时,级联保存所有关联的新建的瞬时状态的对象,并且级联更新所有关联的游离状态的对象。

     Delete:当通过Session的delete()方法删除当前对象时,会级联删除所有关联的对象。

    当通过Session的delete()方法删除当前对象时,会级联删除所有关联的对象。

    All:包含save-update,delete的行为。

    注意点:级联也就是说当我们保存持久化对象A的时候自动帮我们保存持久化对象B。

    核心代码:

    在一对多的Dept.hbm.xml的配置文件中添加添加Cascade属性即可。

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <!-- 映射文件开始 -->
    <hibernate-mapping package="cn.day04mapping.onetomany.entity">
    <!--表名称-->
    <class name="Dept" table="DEPT" schema="root">
    <!--列名-->
    <id name="deptid" column="DEPTID">
    <!--主键生成的策略 native:自动生成主键字段-->
    <generator class="native"></generator>
    </id>
    <property name="deptname" column="DEPTNAME"></property>
    <!--植入set 标签 save-update 保存数据 -->
    <set name="emps" cascade="save-update">
    <!--多的一方表的外键列-->
    <key column="deptno"></key>
    <one-to-many class="Emp"></one-to-many>
    </set>
    </class>
    </hibernate-mapping>

    测试类
    //save-update 级联保存数据
    @Test
    public void test(){
    //读取大配置文件
    Configuration cfg=new Configuration().configure();
    //session工厂
    SessionFactory factory=cfg.buildSessionFactory();
    //session对象
    Session session = factory.openSession();
    //开启事务
    Transaction transaction = session.beginTransaction();
    Dept dept=new Dept();
    dept.setDeptname("市场部");

    Emp emp=new Emp();
    emp.setEname("微热的翔");

    emp.setDept(dept);
    dept.getEmps().add(emp);

    session.save(dept);
    //提交事务
    transaction.commit();
    }



    效果图:

    我们可以从sql语句中可以看出,前二个sql语句已经实现了添加了同时添加员工和部门。第三个update语句很明显是冗余的,我们应当怎么解决这个问题了?

    解析:我们可以利用hibernate关联关系的inverse属性

     set元素的inverse属性

    inverse属性指定了关联关系中的方向。

    inverse设置为false,则为主动方,由主动方负责维护关联关系,默认是false 。

    注意:inverse 决定是否把对对象中集合的改动反映到数据库中,所以inverse只对集合起作用,也就是只对one-to-manymany-to-many有效(因为只有这两种关联关系包含集合,而one-to-onemany-to-one只含有关系对方的一个引用)。

    核心代码:

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <!-- 映射文件开始 -->
    <hibernate-mapping package="cn.day04mapping.onetomany.entity">
    <!--表名称-->
    <class name="Dept" table="DEPT" schema="root">
    <!--列名-->
    <id name="deptid" column="DEPTID">
    <!--主键生成的策略 native:自动生成主键字段-->
    <generator class="native"></generator>
    </id>
    <property name="deptname" column="DEPTNAME"></property>
    <!--植入set 标签 save-update 保存数据 inverse 消除多余的update语句-->
    <set name="emps" cascade="save-update" inverse="true">
    <!--多的一方表的外键列-->
    <key column="deptno"></key>
    <one-to-many class="Emp"></one-to-many>
    </set>
    </class>
    </hibernate-mapping>


    当把inverse设置为true时的效果图。

    order-by

    在hibernate中怎么对数据进行排序了?
    解析:由于hibernate框架将书写sql的重任交给了hibernate,所以Hibernate给我们留了一条绿色通道,可以让我们很容易的对集合中的数据进行排序。那就是使用order-by,使用order-by用于在数据库中对集合进行排序。

     核心代码:

    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    <!-- 映射文件开始 -->
    <hibernate-mapping package="cn.day04mapping.onetomany.entity">
    <!--表名称-->
    <class name="Dept" table="DEPT" schema="root">
    <!--列名-->
    <id name="deptid" column="DEPTID">
    <!--主键生成的策略 native:自动生成主键字段-->
    <generator class="native"></generator>
    </id>
    <property name="deptname" column="DEPTNAME"></property>
    <!--植入set 标签 save-update 保存数据 inverse 消除多余的update语句-->
    <set name="emps" cascade="save-update" inverse="true" order-by="empno desc">
    <!--多的一方表的外键列-->
    <key column="deptno"></key>
    <one-to-many class="Emp"></one-to-many>
    </set>
    </class>
    </hibernate-mapping>




    测试类
    @Test
    public void test02(){
    Session session = HibernateUtil.getSession();
    Dept dept = session.get(Dept.class, 24);
    for (Emp item :dept.getEmps()){
    System.out.println(item.getEname());
    }
    }



    效果图

    
    
     
    
    



  • 相关阅读:
    php 计算代码执行时间
    高级php面试题
    MongoDB 或者 redis 可以替代 memcached 吗?
    mysql中myisam,innodb和memory三个存储引擎的区别
    C#发送邮件代码
    使用bootstrap table时不能显示筛选列和分页每页显示的行数
    vue2中,字符串里如何拼接绑定对象
    压缩图片方法
    jquery的ajax方法,在返回中,find方法不起作用
    vue2中,在google浏览器中正常,在ie11中不解析
  • 原文地址:https://www.cnblogs.com/sujulin/p/8136272.html
Copyright © 2020-2023  润新知