[英]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.