hibernate-- org.hibernate.TransactionException:事务未成功启动

时间:2013-08-15 10:30:44

标签: hibernate

我是hibernate的初学者。当我试图将对象保存到不存在该表的DB中时。我得到了一个例外     org.hibernate.TransactionException:未在org.rk.hibernate.HibernateTest.main(HibernateTest.java:20)的org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:170)上成功启动事务

这是我的类文件,我试图将对象保存到DB

package org.rk.hibernate;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.rk.dto.UserDetails;

public class HibernateTest {

    public static void main(String[] args) {
        UserDetails user = new UserDetails();
        user.setUserId(1);
        user.setUserName("GNS");
        try {       
            SessionFactory sf = new Configuration().configure().buildSessionFactory();
            Session session = sf.openSession();
            session.save(user);
            session.getTransaction().commit();
        }
        catch(HibernateException e) {
            e.printStackTrace();
            System.out.println("in exception");
        }
    }
}

使用oracle 11g release 2和hibernate 4.2.4 ..请帮助

3 个答案:

答案 0 :(得分:16)

我认为你不是在任何地方开始你的交易。您已经打开了一个会话,但在开始交易之前,您正在提交它。打开会话后尝试启动它。

像这样:

try {
    // create session
    tx = session.beginTransaction();
    // do something
    tx.commit();
} catch (Exception exp) {
    tx.rollback();
    // close session
}

答案 1 :(得分:7)

为了避免使用org.hibernate.TransactionException,您可以使用以下代码。在提交之前,您可以控制它是否已提交。差异在第5行!tx.wasCommited()

try {
  // create session
  tx = session.beginTransaction();
  // do something
  if (!tx.wasCommitted()){
    tx.commit();
  }
} catch (Exception exp) {
  tx.rollback();
  // close session
}

答案 2 :(得分:0)

我添加了两个TransactionManager,一个是使用下面的代码

创建的
  1. 交易txn = session.beginTransaction();
  2. 另一个是

    1. HibernateTransactionManager的。
    2. 我通过删除删除事务来解决问题txn = session.beginTransaction();

      因此我的代码中只有一个事务管理器。