2012-05-28 52 views
0

我在学习Hibernate期间遇到问题。我写了UnitTest,在那里我尝试添加对象到数据库中。所有的选择工作正常,但插入不工作。休眠会话

public class HibernateTutorial extends BaseTest { 

@Autowired 
SessionFactory sessionFactory; 

@Test 
@Transactional 
public void hibernateTutorial() { 

    @SuppressWarnings("unchecked") 
    List<User> users = sessionFactory.getCurrentSession().createQuery("from User").list(); 


    sessionFactory.getCurrentSession().saveOrUpdate(new User("HiberTest", "HiberPass", "[email protected]", "HiberSurname", 
    "HiberLastname", "HiberAddress", "123432")); 

} 

我也尝试这样的事情

public class HibernateTutorial extends BaseTest { 

@Autowired 
SessionFactory sessionFactory; 

@Test 
@Transactional 
public void hibernateTutorial() { 

    @SuppressWarnings("unchecked") 
    List<User> users = sessionFactory.getCurrentSession().createQuery("from User").list(); 


    sessionFactory.getCurrentSession().saveOrUpdate(
      new User("HiberTest", "HiberPass", "[email protected]", "HiberSurname", "HiberLastname", "HiberAddress", "123432")); 
    sessionFactory.getCurrentSession().getTransaction().commit(); 
} 
} 

它把我的异常该交易没有成功地启动,但它添加用户

这里有一个例外

组织。 springframework.transaction.TransactionSystemException:不能 回滚Hibernate事务;嵌套的例外是 org.hibernate.TransactionException:交易没有成功 开始在 org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:679) 在 org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback( AbstractPlatformTransactionManager.java:845) 在 org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:822) 在 org.springframework.test.context.transaction.TransactionalTestExecutionListener $ TransactionContext.endTransaction(TransactionalTestExecutionListener.java: 512) at org.springframework.test.context.transaction.TransactionalTestExecutionListener.endTransaction(TransactionalTestExecutionListener.java:290) 在 org.springframework.test.context.transaction.TransactionalTestExecutionListener.afterTestMethod(TransactionalTestExecutionListener.java:183) 在 org.springframework。 test.context.TestContextManager.afterTestMethod(TestContextManager.java:406) 在 org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:90) 在 org.springframework.test.context。 junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) 在 org.springframework.test.context.junit4.SpringJUnit4ClassRunne r.runChild(SpringJUnit4ClassRunner.java:240) 在 org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 在org.junit.runners.ParentRunner $ 3.run(ParentRunner.java:193)在 org.junit.runners.ParentRunner $ 1.schedule(ParentRunner.java:52)at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)at org.junit.runners.ParentRunner.access $ 000(ParentRunner。的java:42)在 org.junit.runners.ParentRunner $ 2.evaluate(ParentRunner.java:184)在 org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) 在 org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.eva luate(RunAfterTestClassCallbacks.java:70) 在org.junit.runners.ParentRunner.run(ParentRunner.java:236)在 org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180) 在 org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 在 org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 在org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner。org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner。的java:467) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner。 Java的:390)在 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 产生的原因:org.hibernate.TransactionException:交易没有成功 开始在 org.hibernate作为。 transaction.JDBCTransaction.rollback(JDBCTransaction.java:183) 在 org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:676) ...... 25多个

+0

向我们展示了异常的完整堆栈跟踪,包括确切的错误信息。 –

回答

0

我可以在代码中看到2个问题。

1 - 您的交易尚未开始。

答案:在对数据库执行任何操作之前,您必须使用getSession()。beginTransaction()方法。

2 - 有万一您的交易没有回滚方法失败

答:使用try-catch块,见下面的例子。我的代码

例子:

public void salvarDB(Object object) 
{ 
    Session session = HibernateUtil.getSession(); 
    HibernateUtil.beginTransaction(); 
    try 
    { 
     session.save(object); 
     HibernateUtil.commit(); 
     avisos.salvoComSucesso(object); 
    } 
    catch(ConstraintViolationException e) 
    { 
     avisos.registroJaInserido(object); 
     HibernateUtil.rollback(); 
    } 
    catch (Exception ex) { 
     avisos.falhaAoSalvar(object); 
     HibernateUtil.rollback(); 
    } 
    finally { 
     HibernateUtil.closeSession(); 
    } 
}