欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

session的基本操作(hibernate) 博客分类: 技术 HibernateSQL 

程序员文章站 2024-02-04 11:39:16
...
近日重读Hibernate文档,整理一下思路,发现几个方法没有用过,顺便和大家讨论下 。
session的基本操作有:
persist():
这个操作我以前从没见过,更没有用过,好像是跟save差不多吧?Doc文件上说当级联风格为persist时,这个操作会级联操作关联的对象。这个方法的语义是JSR-220定义的。但具体的与Save的区别却不是很清楚,有知道的不吝赐教,呵呵
save():
这个大家都很熟悉了,首先会赋予一个标志符,然后持久化给定的对象。但是如果使用assigned 标志符产生方法,则会使用当前的标志符值。如果级联风格为save-update,则会持久化相应的关联对象
merge()
拷贝当前的对象的状态到相同标志符的持久化对象的状态。如果当前关联的session中没有持久化对象,Hibernate会加载该对象,并返回这个持久化对象。如果给定的对象没有保存,则Hibernate保存该副本,返回这个新持久化的对象,但给定的对象并没有和session关联。如果指定级联风格为merge,则会级联关联对象。该方法的语义是JSR-200定义的。
saveOrUpdate()
这个也用的很多吧,保存或更新给定对象,取决于给定对象的持久化状态。默认情况下是保存,在指定标志符元素属性为unsaved-value时则会调整。如果级联风格为"save-update",则会级联相关联的对象

delete(),
不说了。

lock(),
用的不多呵呵,但不知大家用过多少。用于对指定对象设置参数中给定的锁。如果锁为LockMode.READ,可以用来执行版本检查;如果锁为LockMode.UPGRADE则用来执行悲观锁。如果指定为LockMode.NONE,则仅仅时持久化一个未持久化的对象。如果级联风格为lock,会级联相关联的对象。
refresh(),
用的不是很多。 从当前数据库中重新读取给定对象的状态。这在执行跨越多个业务任务的长时间session中优势不显著,在少数特定环境下还是有用的,例如:
插入或更新后数据库触发器更改了对象的状态。
当前session中执行完原生SQL后(如批量更新)。
插入Blob或Clob对象后
evict(),
用过几次,但不是很多。从session的缓存中去除当前实例。执行后对象的改变将不再和数据库保持同步。。当指定级联风格为'evict’时,会级联操作关联对象。我用的时候主要是用于批量操作的时候,清空缓存,防止内存紧张。
Persist the state of the given detached instance, reusing the current identifier value. This operation cascades to associated instances if the association is mapped with cascade="replicate"
replicate()
重用当前的标志符,持久化当前已经脱离session的对象的状态。具体的操作和要看参数ReplicationMode。如果是ReplicationMode.EXCEPTION,则在复制时如果有重复的行数据,则抛出异常。ReplicationMode.IGNORE则忽略异常。ReplicationMode.OVERWRITE则会覆盖掉已有行数据。ReplicationMode.LATEST_VERSION则是在有重复时使用最新的版本进行控制。
相关标签: Hibernate SQL