Results 1 to 6 of 6

Thread: Problem with JTA on JPA

  1. #1
    Join Date
    Jun 2009
    Posts
    3

    Default Problem with JTA on JPA

    Hello.

    I'm trying to get JTA on JPA working with Glassfish's transaction manager. Persistence provider for JPA is Hibernate in my case. I'm getting "no transaction is in progress" exception when I'm calling flush method of JpaTemplate object.

    Here is my applicationContext.xml
    Code:
    <tx:jta-transaction-manager />
    
            <context:annotation-config />
    
            <bean id="entityManagerFactory"    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
                <property name="dataSource" ref="dataSource"/>
                <property name="jpaVendorAdapter">
                   <bean
                   class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                      <property name="showSql" value="true" />
                      <property name="generateDdl" value="false" />
                      <property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect" />
                   </bean>
                </property>
             </bean>
    
             <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
                   <property name="driverClassName" value="com.mysql.jdbc.Driver" />
                   <property name="url" value="jdbc:mysql://localhost/test" />
                   <property name="username" value="root" />
                   <property name="password" value="1234" />
             </bean>
    
            <bean id="dao" class="db.JtaJpaDao" />
    My DAO:
    Code:
    public class JtaJpaDao extends Dao {
    
        private JpaTemplate jtp;
    
        @Autowired
        public void setEntityManagerFactory( EntityManagerFactory emf ) {
            jtp = new JpaTemplate( emf );
        }
    
        public void updateUser( Userr user ) {
            jtp.merge( user );
            jtp.flush();
        }
    
        // ...
    }
    My controller:
    Code:
    @Controller
    @RequestMapping("/editUser.do")
    @SessionAttributes({"user", "allGroups"})
    public class UserController {
        @Autowired
        private Dao dao;
    
        private UserTransaction utx;
    
        @Autowired
        public UserController( JtaTransactionManager jtm ) {
            utx = jtm.getUserTransaction();
        }
    
        @RequestMapping(method=RequestMethod.POST)
        public String storeUserParams( /* ... */)
            
            // ...
    
            try {
                utx.begin();
                dao.updateUser(user);
                utx.commit();
            } catch (Exception ex) {
                return "editUser";
            }
    
           // ...
        }
    }
    And here is stack trace:
    Code:
    javax.persistence.TransactionRequiredException: no transaction is in progress
            at org.hibernate.ejb.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:301)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at org.springframework.orm.jpa.ExtendedEntityManagerCreator$ExtendedEntityManagerInvocationHandler.invoke(ExtendedEntityManagerCreator.java:358)
            at $Proxy117.flush(Unknown Source)
            at org.springframework.orm.jpa.JpaTemplate$8.doInJpa(JpaTemplate.java:295)
            at org.springframework.orm.jpa.JpaTemplate.execute(JpaTemplate.java:184)
            at org.springframework.orm.jpa.JpaTemplate.flush(JpaTemplate.java:293)
            at db.JtaJpaDao.updateUser(JtaJpaDao.java:33)
            at controllersJTA.UserController.storeUserParams(UserController.java:99)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:421)
            at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:136)
            at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:326)
            at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:313)
            at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:875)
            at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
            at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
            at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:511)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:754)
            at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
            at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:431)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:337)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:218)
            at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
            at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
            at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:250)
            at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:218)
            at org.apache.catalina.core.StandardWrapperValve.preInvoke(StandardWrapperValve.java:460)
            at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:139)
            at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:186)
            at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:719)
            at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:657)
            at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:96)
            at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98)
            at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:187)
            at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:719)
            at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:657)
            at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:651)
            at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1030)
            at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:142)
            at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:719)
            at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:657)
            at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:651)
            at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1030)
            at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:325)
            at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:242)
            at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:180)
            at com.sun.grizzly.http.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:633)
            at com.sun.grizzly.http.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:570)
            at com.sun.grizzly.http.DefaultProcessorTask.process(DefaultProcessorTask.java:827)
            at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:152)
            at com.sun.enterprise.v3.services.impl.GlassfishProtocolChain.executeProtocolFilter(GlassfishProtocolChain.java:71)
            at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:103)
            at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:89)
            at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
            at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:67)
            at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:56)
            at com.sun.grizzly.util.WorkerThreadImpl.processTask(WorkerThreadImpl.java:325)
            at com.sun.grizzly.util.WorkerThreadImpl.run(WorkerThreadImpl.java:184)
    Thank you.
    Last edited by mtomy; Jun 17th, 2009 at 11:22 AM. Reason: wrong stack trace

  2. #2
    Join Date
    Sep 2009
    Location
    China-ShangHai
    Posts
    3

    Default

    in applicationContext.xml ,you not configure 'EntityManager'.

  3. #3
    Join Date
    Jun 2009
    Posts
    3

    Default

    Quote Originally Posted by xiayu0422 View Post
    in applicationContext.xml ,you not configure 'EntityManager'.
    Why should i do it? I don't explictly use EntityManager but EntityManagerFactory to construct JpaTemplate.

  4. #4
    Join Date
    Sep 2009
    Location
    China-ShangHai
    Posts
    3

    Default

    [IMG]C:\Documents and Settings\Administrator\桌面\未命名.jpg[/IMG]


    look this.

  5. #5
    Join Date
    Sep 2009
    Location
    China-ShangHai
    Posts
    3

    Thumbs down

    @Autowired
    public UserController( JtaTransactionManager jtm ) {
    utx = jtm.getUserTransaction();
    }

    you use the 'JtaTransactionManager' in this method,and use annotation:@autowired. configure JtaTransactionManager in applicationContext.xml .
    try it.

  6. #6
    Join Date
    Jun 2009
    Posts
    3

    Default

    I configured JtaTransactionManager with <tx:jta-transaction-manager /> in my applicationContext. As i know, it's getting appropriate JTA transaction manager from application server via JDBC path.

    I've faced this problem only using JPA with JTA (Hibernate as persistence provider). When i used Hibernate (with no JPA) with JTA my web app was working correctly.

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •