控制insert和update语句
Hibernate在初始化阶段,就会根据映射文件的映射信息,为所有的持久化类预定义以下SQL语句:
- insert语句,例如Person类的insert语句如下:
insert into person(id,name,age,address) values(?,?,?,?)
- update语句,例如Person类的update语句如下:
update person set id=?,name=?,age=?,address=?
- delete语句,例如Person类的delete语句如下:
delete from person where id=?
- 根据OID来检索持久化类实例的select语句,例如Person类的select语句如下:
Select id,name,age,address from person where id=?
以上SQL语句中的问号代表JDBC PreparedStatement中的参数,这些SQL语句都存放在SessionFactory的缓存中,当执行Session的save()、update()、delete()和load()方法时,将从缓存中找到相应的预定义SQL语句,再把具体的参数值绑定到该SQL语句中
在默认情况下,预定义的SQL语句中包含了表的所有字段,此外,Hibernate还允许在映射文件中控制insert和update语句的内存,例如:
<property name=”addrsss” update=”false” column=”address”/>
以上代码把<property>元素的update属性设置为false,这表明在update语句中不会包含address字段。
映射属性 | 作用 |
<property>元素的insert属性 | 如果为false,在insert语句中不包含该字段,表明该字段永远不能被插入。默认值为true |
<property>元素的update属性 | 如果为false,update语句中不包含该字段,表明该字段永远不能被更新,默认值为true |
<class>元素的mutable属性 | 如果为false,等价于所有的<property>元素的update属性为false,表示整个实例不能被更新,默认值为true |
<property>元素的dynamic-insert属性 | 如果为true,表示当保存一个对象时,会动态生成insert语句,只有这个字段取值不能为null,才会把它包含到insert语句中。默认值为false |
<property>元素的dynamic-update属性 | 如果为true,表示当更新一个对象时,会动态生成update语句,只有该字段取值不为null,才会把它包含到update语句中。默认值为false |
<class>元素的dynamic-insert属性 | 如果为true,等价于所有的<property>元素的dynamic-insert属性为true,表示当保存一个对象时,会动态生成insert语句,insert语句中仅包含所有取值不为null的字段。默认值为false |
<class>元素的dynamic-update属性 | 如果为true,等价于所有的<property>元素的dynamic-update属性为true,表示当保存一个对象时,会动态生成update语句,update语句中仅包含所有取值不为null的字段。默认值为false |