session的基本操作(hibernate) 博客分类: 技术 HibernateSQL
程序员文章站
2024-02-04 11:39:22
...
近日重读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则是在有重复时使用最新的版本进行控制。
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则是在有重复时使用最新的版本进行控制。