Session的保存、删除及更新方法

2013/05/02 16:11
阅读数 141


(1)       save()方法:将一个对象的属性取出放入PreparedStatement语句中,然后向数据库中插入一条记录(或多条,如果有级联)。

调用save()方法将临时对象保存到数据库中,对象的临时状态将变为持久化状态,当对象在持久化状态时,他一直位于Session的缓存中,对他的任何操作在事务提交时都将同步到数据库,因此,对一个已经持久化的对象调用save()或update()方法都是没有意义的。

Session保存一个对象时,按照以下的步骤进行:

a)         根据配置文件为主键id设置的生成算法,为对象生成一个id

b)         将对象纳入session的内部缓存(一个map

c)         事务提交时,清理缓存,将新的对象通过insert语句持久化到数据库中。

(2)       Update()方法:重新关联托管对象为持久化状态对象;显示调用以更新对象。

a)         Update()方法不发送SQL语句:调用update()方法时,并不立即发送sql语句,对对象的更新操作将累计起来,在事务提交时有flush()清理缓存,然后发送一条sql语句完成全部的更新操作。

b)         Hibernate总是执行update()方法:在使用update()方法进行托管对象关联时,不管这个托管对象在离开Session之后有没有进行更改,在清理缓存时Hibernate总是发送一条update语句,以确保托管对象和数据库记录的数据一致。

c)         先执行select语句来判断,然后才执行update语句:把映射文件中<class>标签的select-before-update设为true,这样在执行这一个类的update语句之前,Hibernate都会发送一条select语句取得数据库中的值,和当前对象的值进行比较,如果值相同则不必发送update语句,只有不相同时才发送。

d)         批量更新:在配置文件hibernate.cfg.xml中设置<property name=”hibernate.jdbc.batch_size”>30</property>则在累积到30条语句时才向数据库发送。在进行批量操作时(包括更新、删除),最好的方法是调用JDBCAPI进行操作。

(3)       saveOrUpdate()方法:兼具save()和update()方法,对于传入的对象,该方法首先是判断其是托管对象还是临时对象,然后调用合适的方法。

Hibernate判断对象是临时对象的方法:

a)         在映射文件中<id>标签设置了unsaved-value属性,并且实体对象的id取值和unsaved-value匹配(默认为null

b)         在映射文件中<version>标签设置了unsaved-value属性,并且实体对象的id取值和unsaved-value匹配(默认为null

(4)       Delete()方法:负责删除一个对象(包括持久对象和托管对象)。为了解决批量删除的问题,常用的办法是使用bulk delete方法

Query query= session.createQuery(“delete from student”);

Query.executeUpdate();

但是他也有问题,批量删除后的数据还会在缓存中,因此程序查询时可能得到脏数据。


展开阅读全文
c#
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部