首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

Hibernate Session步骤小结

2012-10-14 
Hibernate Session方法小结hibernate session中的load方法返回的一个POJO的代理对象,只有在访问其field时

Hibernate Session方法小结
hibernate session中的load方法返回的一个POJO的代理对象,只有在访问其field时才进行实际的数据装载(向数据库发出一条select查询),如果该通过getter方法来访问其field值,但是session已经close,将抛出延迟初始化的异常。如果load加载的是一条不存在的数据,在该entity的field访问时,将抛出ObjectNotFoundException的异常。
对于session中的get方法,将会实时返回一个实际的POJO对象,而不是load中返回的代理对象。调用get时将立即发出select查询。对于不存在的数据记录,get将返回一个null值,在调用其方法时将产生NullPointerException。

hibernate session中的update方法用来更新对应的pojo对象到数据库中。update方法可以更新一个detached对象,前提条件是该detached对象必须包含id值,并且该update会更新该pojo对象中所有的值到数据库中(根据hbm文件中的配置)。update方法同时也可以更新一个persistence对象到数据库中,如果pojo对象已经是persistence对象(也就是已经存在于session的cache中),进行更新操作只需设置为对应的field值,甚至不需要调用update方法,在session关闭时会自动同步到数据库中。
hibernate中对于merge操作同样能达到持久化的目的,那么他和update方法有什么区别呢?merge方法在进行更新操作时,会首先判断该pojo对象是否是一个persistence对象,如果不是,那么他会首先根据id发出一条select查询,并将查询出的新对象加入到session的cache中,纳入session的生命周期管理中,然后再根据变化进行update。

对于update一个detached对象将导致的全盘update,就是所有在xml配置中的列都将进行update。可以通过在xml的class元素上设置dynamic-update属性和merge方法来避免所有列的update。merge由于merge方法将自动发出一条select查询来将detached对象纳入session的管理,所有对于大批量的操作可能将产生性能问题。建议使用update query来进行部分列的更新。这种特性在hibernate 3.3中才被加入到hibernate中。 1 楼 nickphoenix 2012-01-12   引用可以通过在xml的class元素上设置dynamic-update属性和merge方法来避免所有列的update。
为什么一定要用merge?我只配置了dynamic-update好像也可以. 2 楼 ceci.lia 2012-01-16   nickphoenix 写道引用可以通过在xml的class元素上设置dynamic-update属性和merge方法来避免所有列的update。
为什么一定要用merge?我只配置了dynamic-update好像也可以.
因为对于detached对象,用update方法会出错。update方法要求实体对象必须是session管理的,也就是通过session的load或者get方法载入session中。merge方法对于detached对象会先进行get操作,将一个detached对象变成session管理的对象后,然后再进行update。这边是针对detached对象所以需要调用merge。

热点排行