hibernate获得session session可以存在多少个

Hibernate中调用session.save()如何确定是否保存成功
[问题点数:30分,结帖人u]
Hibernate中调用session.save()如何确定是否保存成功
[问题点数:30分,结帖人u]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
本帖子已过去太久远了,不再提供回复功能。Spring+Hibernate集成后事务与Session的一些理解_博客园
当前位置: >
>Spring+Hibernate集成后事务与Session的一些理解
Spring+Hibernate集成后事务与Session的一些理解
& 作者:快鸟 & 来源: 博客园-kevin-yuan &
Spring的配置文件,在web.xml加载时,就按照类得映射给动态注入了,而且对于其中需要加载的hibernate配置文件,也只加载一次,就把sessionFactory注入给对象中。然后在类中如果需要取得sessionFactory,只需继承HibernateDaoSupport来取得session.不需要在类中写set方法,因为由HibernateDaoSupport中提供。
以往我们单独使用Hibernate编程式事务,我们都是这样的步骤:
Session&session=HibernateUtils.getSessionFactory().getCurrentSession();
session.beginTranstraction();//开启事务
session.save(…..);
log.add(log);//假设log.add是在另一个类中的操作数据库的方法。其中也要用session来操作。HibernateUtils.getSessionFactory().getCurrentSession().save(…..);
session.getTranstraction().commit();
有异常则session.getTranstraction().rollback();
* 采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()
创建的session则不会.所以以上的session是一直都是一个session.
个人认为:(不管你要执行多少条语句,最后一起commit,就是一个事,也就是一个事务。一个线程只存在一个session)
* 采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()创建的session必须手动关闭
使用getCurrentSession()需要在hibernate.cfg.xml文件中加入如下配置:
*如果使用的是本地事务(jdbc事务)
&propertyname=&hibernate.current_session_context_class&&thread&/property&
* 如果使用的是全局事务(jta事务)
&propertyname=&hibernate.current_session_context_class&&jta&/property&&&& &
采用Spring之后我们采用采用声明式事务
1、声明式事务配置
&&&&&&&& *配置SessionFactory
&&&&&&&& *配置事务管理器
&&&&&&&& *事务的传播特性
&&&&&&&& *那些类那些方法使用事务
2、了解事务的几种传播特性
&&&&&&&& 1.&&&&& PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务。如果没有事务则开启
&&&&&&&& 2.&&&&& PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行
&&&&&&&& 3.&&&&& PROPAGATION_MANDATORY: 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。
&&&&&&&& 4.&&&&& PROPAGATION_REQUIRES_NEW: 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。
&&&&&&&& 5.&&&&& PROPAGATION_NOT_SUPPORTED: 总是非事务地执行,并挂起任何存在的事务。
&&&&&&&& 6.&&&&& PROPAGATION_NEVER: 总是非事务地执行,如果存在一个活动事务,则抛出异常
&&&&&&&& 7.&&&&& PROPAGATION_NESTED:如果一个活动的事务存在,则运行此文来自: 马开东博客
转载请注明出处 网址:
在一个嵌套的事务中. 如果没有活动事务,
&&&&&&&& &&&& 则按TransactionDefinition.PROPAGATION_REQUIRED属性执行
&&&&&&& 举一个例子:required
public class UserManagerImpl extends HibernateDaoSupport implements UserManager {&& && & && private LogManager logM&&&&
&&&&&& public void addUser(User user) {& &&&&&&&&& this.getHibernateTemplate().save(user);&&&& & & && Log log = new Log();&&&&&&&&&&& log.setType(&安全日志&);&&&&&&&&&&& log.setDetail(&xxx进入系统&);&&& & & & & log.setTime(new Date());&&&&&&&&&&& logManager.addLog(log);& & & }
public class LogManagerImpl extends HibernateDaoSupport implements LogManager {&& &public void addLog(Log log) {&& &&& &this.getHibernateTemplate().save(log);&& &}}
在add方法上都配置Required属性,这样在执行addUser时,会开启新事务,然后在方法执行后,再进行事务提交。其中遇到了addlog方法,它发现当前有事务然后就用当前事务,然后当当前事务提交后,他也跟着提交。
3、Spring事务的隔离级别
&&&&&&&& 1.&&&&& ISOLATION_DEFAULT: 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
&&&&&&&& &&&& 另外四个与JDBC的隔离级别相对应
&&&&&&&& 2.&&&&& ISOLATION_READ_UNCOMMITTED: 这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。
&&&&&&&& &&&& 这种隔离级别会产生脏读,不可重复读和幻像读。
&&&&&&&& 3.&&&&& ISOLATION_READ_COMMITTED: 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
&&&&&&&& 4.&&&&& ISOLATION_REPEATABLE_READ: 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
&&&&&&&& &&&& 它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
&&&&&&&& 5.&&&&& ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。
&&&&&&&& &&&& 除了防止脏读,不可重复读外,还避免了幻像读。
4、编写业务逻辑方法
&&&&&&&& *继承HibernateDaoSupport类,使用HibernateTemplate来持久化,HibernateTemplate是
&&&&&&&& &Hibernate Session的轻量级封装
&&&&&&&& *默认情况下运行期异常才会回滚(包括继承了RuntimeException子类),普通异常是不会滚的
&&&&&&&& *编写业务逻辑方法时,最好将异常一直向上抛出,在表示层(struts)处理
&&&&&&&& *关于事务边界的设置,通常设置到业务层,不要添加到Dao上&
相关阅读:
来源:(微信/QQ:,微信公众号:makaidong-com) &&&&&& 欢迎分享本文,转载请保留出处!
&&&&&& 【原文阅读】:
上一篇:没有了
【相关文章】
每日最新文章
每日最热文章
spring组件扫描
本周最热文章
本月最热文章
本年最热文章
Powered by
Copyright &
, All Rights Reserved君,已阅读到文档的结尾了呢~~
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
hibernate的session存在了两个相同的标识,但是是不同实体,不知如何解决
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
您的访问请求被拒绝 403 Forbidden - ITeye技术社区
您的访问请求被拒绝
亲爱的会员,您的IP地址所在网段被ITeye拒绝服务,这可能是以下两种情况导致:
一、您所在的网段内有网络爬虫大量抓取ITeye网页,为保证其他人流畅的访问ITeye,该网段被ITeye拒绝
二、您通过某个代理服务器访问ITeye网站,该代理服务器被网络爬虫利用,大量抓取ITeye网页
请您点击按钮解除封锁&下次自动登录
现在的位置:
& 综合 & 正文
项目不定时报hibernate的session没有关闭的问题
报错如下:java.lang.IllegalStateException: Connection UserConnection[ManagedConnectionImpl[jdbc/mobile09.199]] was not closed. Connections must have a close() in a finally block.
Closing dangling connections.
All connections must have a close() in a finally block.
或者java.lang.IllegalStateException: unclosed connection: UserPoolItem[jdbc/mobile09,8669] was allocated at
网上没有解决这个问题的,底层报错的方法很简单
public List&T& find(String hql, int firstResult, int maxCount) {final Query query = createQuery(hql);query.setMaxResults(maxCount);query.setFirstResult(firstResult);
return query.list();
Spring管理了session池,为什么还会报未关闭呢?如果我们在createQuery(hql);方法的session使用完毕后,手工写close,也不能解决问题,况且这样,影响了session池的效率。引起这个问题的原因究竟是什么呢?
原来是他!对,事务!
你在配置文件中有了如下配置:
&bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"&&property name="sessionFactory"&&ref local="sessionFactory" /&&/property&
&tx:annotation-driven transaction-manager="transactionManager" /&
你必须在的逻辑层实现类上加入@Transactional注解。
这样才知道你事务的开始边界和结束边界,不会因为不知道你事务的边界而不关闭session.
&&&&推荐文章:
【上篇】【下篇】

我要回帖

更多关于 hibernate no session 的文章

 

随机推荐