0
votes

I have a problem during studying Hibernate. I wrote UnitTest and there i try to add object into DB. All selects are working properly, but insert not working so.

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"));

}

I also try something like this

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();
}
}

It throw me Exception that Transaction not succesfully started, but it add user

Here is an Exception

org.springframework.transaction.TransactionSystemException: Could not roll back Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started at org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:679) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(AbstractPlatformTransactionManager.java:845) at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:822) at org.springframework.test.context.transaction.TransactionalTestExecutionListener$TransactionContext.endTransaction(TransactionalTestExecutionListener.java:512) at org.springframework.test.context.transaction.TransactionalTestExecutionListener.endTransaction(TransactionalTestExecutionListener.java:290) at org.springframework.test.context.transaction.TransactionalTestExecutionListener.afterTestMethod(TransactionalTestExecutionListener.java:183) at org.springframework.test.context.TestContextManager.afterTestMethod(TestContextManager.java:406) at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:90) at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:240) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) at 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) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61) at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70) at org.junit.runners.ParentRunner.run(ParentRunner.java:236) at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:180) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by: org.hibernate.TransactionException: Transaction not successfully started at org.hibernate.transaction.JDBCTransaction.rollback(JDBCTransaction.java:183) at org.springframework.orm.hibernate3.HibernateTransactionManager.doRollback(HibernateTransactionManager.java:676) ... 25 more

1
Show us the complete stack trace of the exception, containing the exact error message. - JB Nizet

1 Answers

0
votes

I can see 2 problems in your code.

1 -Your transactions have not been started.

Answer: You have to use the getSession().beginTransaction() method before you do anything on Database.

2 - There's no rollback method in case your transactions fails

Answer: Use a try-catch block, see example below.

Example of my code:

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();
    }
}