Hibernate无法开启事务的问题 .

wengkevin 2014-07-13 10:49:41
环境:

数据库:SQL SERVER 2000

服务器:Tomcat

开发技术:Jsp,Hibernate

问题:在Session.beginTransaction()后出现transaction not successfully started
事务不能开启的问题
整个代码非常简单,就是一个 实体类,用Dao保存到数据库,再没有使用其它的技术

Dao是自己写的
	public void add(T bean)
{
Session session = HibernateSessionFactory.getSessionFactory().openSession();

try {
session.beginTransaction();
session.persist(bean);
session.getTransaction().commit();

}
catch (RuntimeException e) {
session.getTransaction().rollback();
throw e;
}
finally {
session.close();
}
}

这个代码在以前类似的环境中使用过,没出现问题.
但这次怎么都不行,总是报 事务不能成功启动的异常.
试着在Hibernate中加入了C3p0连接池,异常依旧.

百度一下,有的说是可能存在事务的嵌套,有的说是其它的原因,

current_session_context_class 配置为thread,异常依旧.

试试不开新Session吧.直接用HibernateSessionFactory.getSession();试试,
没想到一下通过了.

HibernateSessionFactory.getSession();方法是从当前纯程中取Session,如果当前线程中没有Session,它会新建一个Session放到当前线程中

原理是这么个原理,看来可能是事务有嵌套问题
但是我没有开过Session啊,自己也没有开启过其它的事务.
只能猜测是Tomcat中哪里自动开启了吧.

对Hibernate理解的才是不够精.

问题解决了,但原因不太明,不知道高手们有没有其它的解释?


...全文
315 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
hbj89 2016-12-12
  • 打赏
  • 举报
回复
public void add(T bean) { Session session = HibernateSessionFactory.getSessionFactory().openSession(); session.beginTransaction(); try { session.persist(bean); session.getTransaction().commit(); } catch (RuntimeException e) { session.getTransaction().rollback(); throw e; } finally { session.close(); } } 这样就可以了
wengkevin 2014-07-14
  • 打赏
  • 举报
回复
现在就是只有Jsp与Hibernate两种,没有Spring, 如果用HibernateSessionFactory.getSessionFactory().openSession(); 就出现 异常 :transaction not successfully started 用HibernateSessionFactory.getSession();就正常了 HibernateSessionFactory是MyEclipse10自动生成的 现在能正常工作,就是想知道下原理,为什么新开Session就不行了? 网上查了下基本都是Spring的,但我的没有Spring,不知道产生这种现象的原因
sxax 2014-07-14
  • 打赏
  • 举报
回复
看了下你说了就是要了JSP和Hibernate这两种技术,如果你是要了Spring控制是事务,那么请将 session.beginTransaction(); Hibernate的事务注释掉,如果不是这个问题,可以试试SessionFactory.getCurrentSession()
dandan8989251 2014-07-13
  • 打赏
  • 举报
回复
把异常贴上来...................

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧