我是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 ..请帮助
答案 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,一个是使用下面的代码
创建的另一个是
我通过删除删除事务来解决问题txn = session.beginTransaction();
因此我的代码中只有一个事务管理器。