与触发器协同工作

当Hibernate与数据库中的触发器协同工作时,会造成两类问题:

1)触发器使Session的缓存中的数据与数据库不一致

2)Session的update()方法盲目地激发触发器

解决方法:

 

1)触发器使Session的缓存中的数据与数据库不一致

 

若对象Customer中registTime字段,其值由数据库在执行insert、update时赋值。但是当Hibernate执行完save()或update()后返回的Customer对象中的registTime字段中任然没有数据。这就是其不一致的现象。

解决方法:由此可见,假如Session的save(),update(),saveOrUpdate(),delete()方法会激发一个触发器,而这个触发器的行为会导致Session的缓存数据和数据库不一致,解决办法是在执行完这个操作后,立即调用Session的flush()和refresh()方法,迫使Session的缓存与数据库同步。另一方面,如果执行完Session的save()方法后,不会再访问Customer对象,那么也没有必要迫使Session的缓存与数据库同步。

 

2)Session的update()方法盲目地激发触发器

 

假如在数据库中定义了由update事件激发的触发器,那么必须谨慎使用Session的update(),saveOrUpdate()方法,这两个方法都能够使一个游离对象重新和Session关联,由于在Session中还不存在这个对象的快照,因此Session无法判断游离对象的属性是否和数据库保持一致,为了保险,不管游离对象的属性是否发生过变化,都会执行update语句,而update会激发数据库中相应的触发器。假如游离对象的属性实际上和数据库时一致的,那update语句就是多余的,激发触发器时无意义的。为了避免之一情况,可以在映射文件的<class>元素中设置select-before-update属性,如<class name="mypack.Customer" table="CUSTOMER" select-before-update="true">

当Session的update(),saveOrUpdate()方法更新一个Customer游离对象时,会先执行select语句,获得这个Customer对象在数据库中的最新数据,然后比较Customer游离对象与数据库中的数据是否一致,只有在不一致的情况下,才会执行update语句,这就避免执行多余的update语句,以及盲目地触发相关触发器。

你可能感兴趣的:(Hibernate,数据库,session,delete,Class,insert)