suri
suri

Reputation: 433

How to handle transaction in Spring with weblogic and JPA

I am implementing an application in Spring with JPA and I am deploying it in weblogic server. I want to know how to handle transactions. For database configuration I configured persistence.xml where I declared the transaction type as JTA. In my persistence logic, while updating something, I am using this logic:

entityManager.getTransaction().commit();

but it throws an exception. If I don't commit the data is not updating in the database table. Even if I try with declaring @Transactional at method level it is not working. Can any body please tell me how to handle transactions and if I am using them correctly or not.

Here are my files.

The DAO class:

  @Override
        @Transactional
        public void updateBpm(User user) {
            EntityManager entityManager=null;
            try{
             entityManager=entityManagerFactory.createEntityManager();
            String  query="update com_tt_bpm_batch set status = 'FAILED' where  seqNo="+user.getSeqNo();
            entityManager.createNativeQuery(query);
            System.out.println("table updated Successfully..");

                }
            catch(Exception e){
                logger.error(e.getStackTrace());

            }

        }

Here is my spring configuration file:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xmlns:batch="http://www.springframework.org/schema/batch"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:task="http://www.springframework.org/schema/task" xmlns:util="http://www.springframework.org/schema/util"
    xmlns:jdbc="http://www.springframework.org/schema/jdbc" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/batch
    http://www.springframework.org/schema/batch/spring-batch-2.2.xsd
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/mvc
    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.2.xsd
    http://www.springframework.org/schema/task
        http://www.springframework.org/schema/task/spring-task-3.2.xsd
        http://www.springframework.org/schema/util 
        http://www.springframework.org/schema/util/spring-util-3.2.xsd
        http://www.springframework.org/schema/jdbc 
        http://www.springframework.org/schema/jdbc/spring-jdbc-3.2.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
    ">
    <tx:annotation-driven />
    <context:annotation-config/>
    <mvc:annotation-driven/>
     <context:component-scan base-package="com.tcs" /> 


        <bean id="entityManagerFactory"
            class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
             <property name="persistenceXmlLocation" value="/WEB-INF/META-INF/persistence.xml" /> 
             <property name="persistenceUnitName" value="Mypersist" /> 
            <!--  <property name="dataSource" ref="dataSource" /> -->
             <property name="jpaVendorAdapter" ref="jpaVendorAdapter" />
             <property name="jpaDialect" ref="jpaDialect" />
             <property name="jpaProperties">
            <props>
                <prop key="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.WeblogicTransactionManagerLookup
                </prop>
            </props>
        </property> 
        </bean>

      <bean id="baseTransactionProxy" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
    abstract="true">
    <property name="transactionManager" ref="transactionManager"/>
    <property name="transactionAttributes">
      <props>
        <prop key="updateBpm">PROPAGATION_REQUIRED</prop>
        <prop key="getforBpm">PROPAGATION_REQUIRED</prop>
      </props>
    </property>
  </bean>
        <bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
          <!--  <property name="database" value="oracle" /> -->
           <property name="databasePlatform" value="org.hibernate.dialect.Oracle10gDialect" />
       </bean>

<bean id="jpaDialect" class="org.springframework.orm.jpa.vendor.HibernateJpaDialect" />



 <bean id="transactionManager"
    class="org.springframework.transaction.jta.WebLogicJtaTransactionManager">
    <property name="transactionManagerName"
      value="javax.transaction.TransactionManager"/>
  </bean>


    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/pages/" />
        <property name="suffix" value=".jsp"/>
    </bean>

</beans>

Here is my persistence.xml

<?xml version="1.0" encoding="UTF-8"?>
<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="Mypersist" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>
         <jta-data-source>MCDataSource</jta-data-source>

    </persistence-unit>


</persistence>

Upvotes: 3

Views: 3393

Answers (2)

Ales
Ales

Reputation: 180

I think better handle transactions on service layer (it's for situation when your service use several dao methods). And you should create your entity manager once, not for every dao method.

It's example how I handle transactions with jpa.

dao layer:

@PersistenceContext
private EntityManager entityManager;

@Override
public String create(Brand brand) throws DaoException {
    try {
        entityManager.persist(brand);
    } catch (HibernateException e) {
        throw new DaoException(e);
    }
    return brand.getId();
}

example of service layer:

@Service
@Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW)
public class BrandServiceImpl implements IBrandService {

    @Autowired
    private IBrandDao brandDao;

    @Override
    public TransportObject create(Brand brand) {
        TransportObject transportObject = null;
        try {
           // some code here
        } catch (DaoException e) {

        }
        return transportObject;
}

and configuration example:

<bean id="jpaVendorAdapter" class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
        <property name="showSql" value="false"/>
        <property name="generateDdl" value="false"/>
        <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
    </bean>

    <bean id="myEmf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="packagesToScan">
            <value>package path</value>
        </property>
        <property name="jpaVendorAdapter" ref="jpaVendorAdapter"/>
    </bean>

    <tx:annotation-driven transaction-manager="txManager" />
    <bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="myEmf" />
    </bean>

Upvotes: 0

rapasoft
rapasoft

Reputation: 961

You are creating query:

entityManager.createNativeQuery(query);

But you are not executing it: http://docs.oracle.com/javaee/6/api/javax/persistence/Query.html#executeUpdate()

Upvotes: 3

Related Questions