簡體   English   中英

休眠會話

[英]Hibernate Sessions

我在研究Hibernate時遇到問題。 我寫了UnitTest,在那里我嘗試將對象添加到DB中。 所有選擇均正常工作,但插入無效。

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", "Hiber@Mail.ru", "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", "Hiber@Mail.ru", "HiberSurname", "HiberLastname", "HiberAddress", "123432"));
    sessionFactory.getCurrentSession().getTransaction().commit();
}
}

拋出異常:事務未成功啟動,但添加了用戶

這是一個例外

org.springframework.transaction.TransactionSystemException:無法回滾Hibernate事務。 嵌套異常是org.hibernate.TransactionException:事務未在org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:845.org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:679)處成功啟動)org.springframework.test.context.transaction.TransactionalTestExecutionListener $ TransactionContext.endTransaction(TransactionalTestExecutionListener.java:512)的org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:822)處。 org.springframework.test.context.transaction.TransactionalTestExecutionListener.afterTestMethod(TransactionalTestExecutionListener.java:183)的context.transaction.TransactionalTestExecutionListener.endTransaction(TransactionalTestExecutionListener.java:290)在org.springframework.test.context.TestContextManager.afterTest estContextManager.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.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)在org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240)在org.junit.runners.ParentRunner $ 3。在org.junit.runners.ParentRunner處運行(ParentRunner.java:193)在org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)處的schedule(ParentRunner.java:52)在org.junit.runners處的運行。 org.junit.runners的ParentRunner.access $ 000(ParentRunner.java:42).org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:ParentRunner $ 2.evaluate(ParentRunner.java:184) 61)在org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate (org.junit.runners.ParentRunner.run(ParentRunner.java:236)的org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180)的(RunAfterTestClassCallbacks.java:70)。位於org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)的jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)位於org.eclipse.jdt.internal的org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)上的junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)在org.eclipse.jdt.internal.junit.runner上。 org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)上的RemoteTestRunner.run(RemoteTestRunner.java:390)原因:org.hibernate.TransactionException:事務未在org.hibernate上成功啟動org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTra)上的.transaction.JDBCTransaction.rollback(JDBCTransaction.java:183) nsactionManager.java:676)...還有25個

我可以在您的代碼中看到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();
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM