控制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