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); }
结果如上,可以看到string类型未赋值的属性都没有对其进行插入,数值类型因为默认值是0所以会进行插入,deptNo因为是外键所以没有进行插入
没设置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-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列
可以看到,对全部的列进行了更新
sal 列也变成了 9999
设置了dynamic-update
设置了之后只对我们更新过的列进行更新
总结
- dynam-insert:设置了此属性对中的空值并不会进行insert,数值型除外
- dynam-update:设置了此属性只对进行了改变的值进行更新