dynamic-insert和dynamic-update属性

时间:2022-03-01 16:13:09

dynamic-insert

 作用:设置对象中没有值的字段 insert并不会对其进行插入.

实体类映射配置如下

<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
    <!-- name实体类路径 table数据库表名 schema表的拥有者-->
    <class name="entity.Emp" table="emp" schema="scott">
        <!-- 此id属性表示 持久化的OID和表的主键映射
            name为实体类中的属性名称 type为数据类型 column为数据库中的列名 -->
        <id name="empno" type="java.lang.Integer" column="empno">
            <!-- 此属性用于指定具体注解生成策略 assigned策略,就是不使用主键生成策略,由手工输入ID. -->
            <generator class="assigned"/>
        </id>
        <!-- name为实体类中的属性名称 type为数据类型 column为数据库中的列名 not-null="true"表示不允许为空 -->
        <property name="ename" type="string"  not-null="true" column="ename"/>
        <property name="deptNo" type="java.lang.Integer" column="deptNo"/>
        <property name="job" type="string" column="job"/>
        <property name="MGR" type="java.lang.Double" column="MGR"/>
        <property name="hiretDate" type="java.sql.Date" column="hireDate"/>
        <property name="sal" type="java.lang.Double" column="sal"/>
        <property name="comm" type="java.lang.Double" column="comm"/>
    </class>
</hibernate-mapping>

首先是设置了dynamic-insert属性的

public static void main(String[] args){
        EmpSerivce empSerivce = new EmpSerivce();
        Emp emp = new Emp();
        emp.setEmpno(7903);
        emp.setEname("张三");
        empSerivce.add(emp);
    }

dynamic-insert和dynamic-update属性

结果如上,可以看到string类型未赋值的属性都没有对其进行插入,数值类型因为默认值是0所以会进行插入,deptNo因为是外键所以没有进行插入

dynamic-insert和dynamic-update属性

没设置dynamic-insert属性的

 

public static void main(String[] args){
        EmpSerivce empSerivce = new EmpSerivce();
        Emp emp = new Emp();
        emp.setEmpno(7905);
        emp.setEname("张三");
        empSerivce.add(emp);
    }

 dynamic-insert和dynamic-update属性

结果如上 全部字段都进行了插入

dynamic-insert和dynamic-update属性

dynamic-update

 作用:设置对象空字段不对其进行更新

不设置dynamic-update

 public void updateEmp(){
        Transaction tx = null;
        try {
            tx= HibernateUtil.currentSession().beginTransaction();
            Emp empUpdate = empDao.update(7900);
            empUpdate.setSal(9999);
            tx.commit();
        } catch (HibernateException e) {
            e.printStackTrace();
            if(tx!=null)
                tx.rollback();  //回滚事务
        }
    }

可以看到在代码中我只更新了sal列

 

dynamic-insert和dynamic-update属性

可以看到,对全部的列进行了更新

dynamic-insert和dynamic-update属性

sal 列也变成了 9999

设置了dynamic-update

dynamic-insert和dynamic-update属性

设置了之后只对我们更新过的列进行更新

总结

  • dynam-insert:设置了此属性对中的空值并不会进行insert,数值型除外
  • dynam-update:设置了此属性只对进行了改变的值进行更新