org.hibernate.HibernateException: save在没有活动事务的情况下是无效的。
org.hibernate.HibernateException: save在没有活动事务的情况下是无效的。
我正在创建一个JSF
应用程序,并在其中使用一些Hibernate的内容。我想要做的只是将实体保存到数据库中,但我一直在遇到这个异常:org.hibernate.HibernateException: save is not valid without active transaction
。起初,我遇到了这个异常:org.hibernate.HibernateException: No CurrentSessionContext configured!
。然后我发现我需要将这个添加到我的hibernate配置中:
。这解决了上面的问题,但现在出现了上述的异常。我在将实体保存到数据库中时是这样做的:public void create(T entity) {getSessionFactory().getCurrentSession().save(entity);}
。我的hibernate.cfg.xml文件如下:
。我使用的是:
- Hibernate-4.1.4.Final
- JDK 1.6
- Tomcat 6
- JSF 2.0
- PrimeFaces 3.3.1
- MySql
。有人知道问题可能在哪里吗?
org.hibernate.HibernateException: save is not valid without active transaction 这个问题的出现是因为在进行保存操作时没有开启事务,解决方法是在保存操作之前开启事务,并在保存操作完成后提交事务。
具体的解决方法如下所示:
public void create(T entity) { org.hibernate.Session ss = getSessionFactory().getCurrentSession(); Transaction tx = ss.beginTransaction(); ss.save(entity); tx.commit(); }
需要注意的是,异常处理部分需要自行处理。
在使用Spring的HibernateTransactionManager配置事务时,虽然日志中显示事务已经正确开始,但是保存操作仍然失败。原因是没有调用session.beginTransaction()方法。解决方法是在保存操作之前调用session.beginTransaction()方法。具体代码如下:
public void create(T entity) { Session session = getSessionFactory().getCurrentSession(); Transaction trans = session.beginTransaction(); session.save(entity); trans.commit(); }
这样就可以保证在保存操作之前开启事务,然后在保存完成后提交事务,避免出现"org.hibernate.HibernateException: save is not valid without active transaction"的异常。