作用:设置对象中没有值的字段 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 voidmain(String[] args){ EmpSerivce empSerivce = newEmpSerivce(); Emp emp = newEmp(); emp.setEmpno(7903); emp.setEname("张三"); empSerivce.add(emp); }
结果如上,可以看到string类型未赋值的属性都没有对其进行插入,数值类型因为默认值是0所以会进行插入,deptNo因为是外键所以没有进行插入
没设置dynamic-insert属性的
public static voidmain(String[] args){ EmpSerivce empSerivce = newEmpSerivce(); Emp emp = newEmp(); emp.setEmpno(7905); emp.setEname("张三"); empSerivce.add(emp); }
结果如上 全部字段都进行了插入
dynamic-update作用:设置对象空字段不对其进行更新
不设置dynamic-update
public voidupdateEmp(){ 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列
可以看到,对全部的列进行了更新
sal 列也变成了 9999
设置了dynamic-update
设置了之后只对我们更新过的列进行更新
总结- dynam-insert:设置了此属性对中的空值并不会进行insert,数值型除外
- dynam-update:设置了此属性只对进行了改变的值进行更新