[size=medium]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中。[/size]
对于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中。[/size]