Menu

Transaction problem with JPA using hibernate

Users
2009-02-11
2013-05-28
  • William Strapazzon

    Hi, I have a case of a transaction problem using "@JpaEntityManagerFactory" on hibernate.

    In the example below, when "@Transactional ( TransactionMode.DISABLED )" is uncommented everything works fine. Any other transaction mode even default results in org.unitils.core.UnitilsException. Caused by: java.lang.UnsupportedOperationException: Not supported by BasicDataSource at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:899)

    the complete stack trace is in the end after the case.

    thanks for any help.

    --------------- CASE : ---------------

    import java.sql.SQLException;
    import javax.persistence.EntityManagerFactory;
    import org.testng.annotations.Test;
    import org.unitils.UnitilsTestNG;
    import org.unitils.database.annotations.Transactional;
    import org.unitils.database.util.TransactionMode;
    import org.unitils.dbunit.annotation.DataSet;
    import org.unitils.dbunit.datasetloadstrategy.impl.RefreshLoadStrategy;
    import org.unitils.orm.jpa.annotation.JpaEntityManagerFactory;

    @Test
    //@Transactional ( TransactionMode.DISABLED )
    @Transactional ( TransactionMode.ROLLBACK )
    @DataSet ( loadStrategy = RefreshLoadStrategy.class , value = { "dataset/customers.xml" } )
    public class TestCustomer extends UnitilsTestNG
    {
        @JpaEntityManagerFactory ( persistenceUnit = "order" )
        EntityManagerFactory factory;

        public void customerExists ( )
        {
            Customer customer = new Customer( "user", "pass" );
            assert customer.exists( );
        }

    }

    --------------- FULL STACK TRACE : ---------------

    org.unitils.core.UnitilsException: Error inserting test data from DbUnit dataset for method public void order.model.TestCustomer.wrongPassword()
        at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:157)
        at org.unitils.dbunit.DbUnitModule$DbUnitListener.beforeTestSetUp(DbUnitModule.java:540)
        at org.unitils.core.Unitils$UnitilsTestListener.beforeTestSetUp(Unitils.java:281)
        at org.unitils.UnitilsTestNG.unitilsBeforeTestSetUp(UnitilsTestNG.java:62)
    Caused by: org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction; nested exception is java.lang.UnsupportedOperationException: Not supported by BasicDataSource
        at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:375)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:377)
        at org.unitils.database.transaction.impl.DefaultUnitilsTransactionManager.doStartTransaction(DefaultUnitilsTransactionManager.java:121)
        at org.unitils.database.transaction.impl.DefaultUnitilsTransactionManager.activateTransactionIfNeeded(DefaultUnitilsTransactionManager.java:112)
        at org.unitils.database.DatabaseModule.activateTransactionIfNeeded(DatabaseModule.java:234)
        at org.unitils.database.DatabaseModule.getDataSourceAndActivateTransactionIfNeeded(DatabaseModule.java:218)
        at org.unitils.dbunit.DbUnitModule.getDefaultDbSupport(DbUnitModule.java:511)
        at org.unitils.dbunit.DbUnitModule.getDataSetFactory(DbUnitModule.java:483)
        at org.unitils.dbunit.DbUnitModule.getDataSetFactory(DbUnitModule.java:471)
        at org.unitils.dbunit.DbUnitModule.getDataSet(DbUnitModule.java:294)
        at org.unitils.dbunit.DbUnitModule.insertDataSet(DbUnitModule.java:148)
        ... 27 more
    Caused by: java.lang.UnsupportedOperationException: Not supported by BasicDataSource
        at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:899)
        at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:43)
        at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
        at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167)
        at org.hibernate.jdbc.JDBCContext.connection(JDBCContext.java:142)
        at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:85)
        at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1353)
        at org.hibernate.ejb.TransactionImpl.begin(TransactionImpl.java:38)
        at org.springframework.orm.jpa.DefaultJpaDialect.beginTransaction(DefaultJpaDialect.java:70)
        at org.springframework.orm.jpa.vendor.HibernateJpaDialect.beginTransaction(HibernateJpaDialect.java:52)
        at org.springframework.orm.jpa.JpaTransactionManager.doBegin(JpaTransactionManager.java:330)
        ... 37 more
    ... Removed 24 stack frames
    FAILED CONFIGURATION: @AfterMethod unitilsAfterTestTearDown(public void order.model.TestCustomer.wrongPassword())
    java.lang.NullPointerException
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlatformTransactionManager.java:771)
        at org.unitils.database.transaction.impl.DefaultUnitilsTransactionManager.rollback(DefaultUnitilsTransactionManager.java:159)
        at org.unitils.database.DatabaseModule.rollbackTransaction(DatabaseModule.java:432)
        at org.unitils.database.DatabaseModule.endTransactionForTestMethod(DatabaseModule.java:398)
        at org.unitils.database.DatabaseModule$DatabaseTestListener.afterTestTearDown(DatabaseModule.java:540)
        at org.unitils.core.Unitils$UnitilsTestListener.afterTestTearDown(Unitils.java:323)
        at org.unitils.UnitilsTestNG.unitilsAfterTestTearDown(UnitilsTestNG.java:79)
    ... Removed 24 stack frames

     
    • William Strapazzon

      As a correction from the previous post, using "@Transactional ( TransactionMode.DISABLED )" the "factory" annotated attribute isn't initialized. which means testing with jpa in unitils doesn't work at all for me.

      I tried many configurations which leads to the same exception.. so I don't know what to do..
      I decided to paste my persistence.xml in case that someone may identify if I am making any mistake.

      thanks for any help.

      <?xml version="1.0" encoding="UTF-8"?>
      <!-- example of a default persistence.xml -->
      <persistence xmlns="http://java.sun.com/xml/ns/persistence"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
                   version="1.0">

          <persistence-unit name="order" >
              <provider>org.hibernate.ejb.HibernatePersistence</provider>
              <properties>
                  <property name="hibernate.hbm2ddl.auto" value="none"/>
                  <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
                  <property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
                  <property name="hibernate.connection.username" value="XXX"/>
                  <property name="hibernate.connection.password" value="XXX"/>
                  <property name="hibernate.connection.url" value="jdbc:postgresql://localhost/YYY"/>
              </properties>
            
          </persistence-unit>
        
      </persistence>

       
    • William Strapazzon

      Ok.. I am really sorry..

      first my problem was already understood in this thread : https://sourceforge.net/forum/message.php?msg_id=4889266

      And an persistence.xml example for spring+jpa was in the http://unitils.org/cookbook.html

       

Anonymous
Anonymous

Add attachments
Cancel