Hibernate+JPA+JTA+Spring

2 respostas
ralphsilver

Galera,

Estou com um problema que eu não consigo resolver e já tentei de tudo: configurei minha aplicação inteira no spring e tudo mais. Mas quando faço uma busca ele me retorna o seguinte erro:

Cannot join transaction: do not override hibernate.transaction.factory_class
Tiles definition factory found for request processor ''.
Cannot join transaction: do not override hibernate.transaction.factory_class
Hibernate: select lotemicros0_.ZZN_LOTEIN as ZZN1_4_, lotemicros0_.R_E_C_N_O_ as R2_4_, lotemicros0_.ZZN_DTGRAV as ZZN3_4_, lotemicros0_.ZZN_DTPROC as ZZN4_4_, lotemicros0_.ZZN_FILIAL as ZZN5_4_, lotemicros0_.ZZN_TIPO as ZZN6_4_ from ZZN010 lotemicros0_
TransactionSynchronization.beforeCompletion threw exception
java.lang.IllegalStateException: JTA TransactionManager not available
        at org.hibernate.transaction.JTATransaction.registerSynchronization(JTATransaction.java:302)
        at org.hibernate.ejb.EntityManagerImpl.close(EntityManagerImpl.java:100)
        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:346)
        at $Proxy292.close(Unknown Source)
        at org.springframework.orm.jpa.EntityManagerFactoryUtils$EntityManagerSynchronization.beforeCompletion(EntityManagerFactoryUtils.java:349)
        at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCompletion(TransactionSynchronizationUtils.java:60)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCompletion(AbstractPlatformTransactionManager.java:848)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:646)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:632)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:319)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
        at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:631)
        at br.edu.unianhanguera.plt.agente.microsiga.business.LoteMicrosigaFacade$$EnhancerByCGLIB$$1f4e13c1.findAll(<generated>)
        at br.edu.unianhanguera.plt.agente.action.WelcomeAction.execute(WelcomeAction.java:37)
        at org.springframework.web.struts.DelegatingActionProxy.execute(DelegatingActionProxy.java:110)
        at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
        at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
        at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
        at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:734)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
        at org.apache.catalina.core.ApplicationFilterChain.servletService(ApplicationFilterChain.java:427)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:333)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
        at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:111)
        at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:75)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:246)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:313)
        at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:287)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:218)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
        at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:94)
        at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:98)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:222)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:166)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:648)
        at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:593)
        at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:587)
        at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:1096)
        at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:288)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.invokeAdapter(DefaultProcessorTask.java:647)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.doProcess(DefaultProcessorTask.java:579)
        at com.sun.enterprise.web.connector.grizzly.DefaultProcessorTask.process(DefaultProcessorTask.java:831)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.executeProcessorTask(DefaultReadTask.java:341)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:263)
        at com.sun.enterprise.web.connector.grizzly.DefaultReadTask.doTask(DefaultReadTask.java:214)
        at com.sun.enterprise.web.portunif.PortUnificationPipeline$PUTask.doTask(PortUnificationPipeline.java:380)
        at com.sun.enterprise.web.connector.grizzly.TaskBase.run(TaskBase.java:265)
        at com.sun.enterprise.web.connector.grizzly.ssl.SSLWorkerThread.run(SSLWorkerThread.java:106)
============================
Total de Lotes: 10
======================
Hibernate: select itemmicros0_.ZZL_LOTEIN as ZZL31_1_, itemmicros0_.R_E_C_N_O_ as R1_1_, itemmicros0_.R_E_C_N_O_ as R1_5_0_, itemmicros0_.ZZL_IDITEM as ZZL2_5_0_, itemmicros0_.ZZL_SEQ as ZZL3_5_0_, itemmicros0_.ZZL_NUMERO as ZZL4_5_0_, itemmicros0_.ZZL_BAIRRO as ZZL5_5_0_, itemmicros0_.ZZL_CEP as ZZL6_5_0_, itemmicros0_.ZZL_CURSO as ZZL7_5_0_, itemmicros0_.ZZL_DATALT as ZZL8_5_0_, itemmicros0_.ZZL_DTPROC as ZZL9_5_0_, itemmicros0_.ZZL_DTVEND as ZZL10_5_0_, itemmicros0_.ZZL_END as ZZL11_5_0_, itemmicros0_.ZZL_ERRO as ZZL12_5_0_, itemmicros0_.ZZL_ESTADO as ZZL13_5_0_, itemmicros0_.ZZL_LOCAL as ZZL14_5_0_, itemmicros0_.ZZL_CODLIV as ZZL15_5_0_, itemmicros0_.ZZL_CODEMP as ZZL16_5_0_, itemmicros0_.ZZL_OBS as ZZL17_5_0_, itemmicros0_.ZZL_DESSIA as ZZL18_5_0_, itemmicros0_.D_E_L_E_T_ as D19_5_0_, itemmicros0_.ZZL_STATUS as ZZL20_5_0_, itemmicros0_.ZZL_LOTEIN as ZZL31_5_0_, itemmicros0_.ZZL_NUMORC as ZZL21_5_0_, itemmicros0_.ZZL_SERIE as ZZL22_5_0_, itemmicros0_.ZZL_NOME as ZZL23_5_0_, itemmicros0_.ZZL_CIDADE as ZZL24_5_0_, itemmicros0_.ZZL_CPF as ZZL25_5_0_, itemmicros0_.ZZL_FILIAL as ZZL26_5_0_, itemmicros0_.ZZL_RA as ZZL27_5_0_, itemmicros0_.ZZL_CODSIA as ZZL28_5_0_, itemmicros0_.ZZL_VALOR as ZZL29_5_0_, itemmicros0_.ZZL_QTDE as ZZL30_5_0_ from ZZL010 itemmicros0_ where itemmicros0_.ZZL_LOTEIN=?
============================
Total de Itens em um lote: 32
======================

A aplicação Lazy funciona, tanto ele me traz o segundo resultado, mas ele me mostra essa exceção. Os resultados que estão entre "=======" foram os da busca desta chamada:

List<LoteMicrosigaEntity> alItem = loteMicrosigaFacade.findAll();

        System.out.print("\n============================\nTotal de Lotes: "+alItem.size()+"\n======================\n");
        System.out.print("\n============================\nTotal de Itens em um lote: "+alItem.get(Integer.parseInt(request.getParameter("nmOpcao"))).getItemMicrosiga().size()+"\n======================\n");

meu ApplicationContext do Spring:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
    
    <bean id="propertyConfigurer"
          class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
          p:location="/WEB-INF/jdbc.properties" />
    
    <bean class="org.springframework.jdbc.datasource.DriverManagerDataSource"
          id="dataSource"
          p:driverClassName="${microsiga.driverClassName}"
          p:password="${microsiga.password}"
          p:url="${microsiga.url}"
          p:username="${microsiga.username}" />

    <!-- ADD PERSISTENCE SUPPORT HERE (jpa, hibernate, etc) -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="hibernateProperties">
            <value>
                hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
                hibernate.show_sql=true
                hibernate.connection.isolation=2
                hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider
                hibernate.transaction.factory_class=org.hibernate.transaction.JTATransactionFactory
                hibernate.transaction.manager_lookup_class=org.hibernate.transaction.JOTMTransactionManagerLookup
                hibernate.current_session_context_class=thread
                hibernate.jdbc.batch_size=5
                hibernate.transaction.flush_before_completion=true
                hibernate.connection.release_mode = after_transaction
            </value>
        </property>
    </bean>
    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory">
        <property name="dataSource" ref="dataSource" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true"/>
            </bean>
        </property>
        <property name="jpaProperties">
            <value>
                hibernate.transaction.factory_class=org.hibernate.transaction.JTATransactionFactory
                hibernate.transaction.manager_lookup_class=org.hibernate.transaction.JOTMTransactionManagerLookup
                hibernate.current_session_context_class=thread
            </value>
        </property>
    </bean>
    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
    <!--CONFIGURAÇÃO E ESTABELECIMENTO DE TRANSACTIONS -->
    <!--bean id="transactionManagerLocal" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="dataSource" ref="dataSource"/>
        <property name="entityManagerFactory" ref="entityManagerFactory"/>
    </bean>
    <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" /-->
    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
    <!--INTERCEPTORS-->

    <!--CONFIGURAÇÃO DE ASPECTOS-->
    <!--aop:config>
        <aop:pointcut id="entityTransaction" expression="execution(* *.business.*Facade.*(..))" />
        <aop:advisor advice-ref="entityTransactionAdvice" pointcut-ref="entityTransaction" />
    </aop:config-->
    <!--CONFIGURAÇÃO DA TRANSACTION-->
    <tx:annotation-driven transaction-manager="transactionManager" />
    <tx:jta-transaction-manager/>
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="beginEntry" propagation="REQUIRES_NEW"/>
            <tx:method name="endEntry" propagation="REQUIRED"/>
            <tx:method name="retorna*" read-only="true"/>
            <tx:method name="get*" read-only="true"/>
            <tx:method name="find*" read-only="true"/>
            <tx:method name="load*" read-only="true"/>
            <tx:method name="*"/>
        </tx:attributes>
    </tx:advice>
    <!--Classes FACADES-->
    <bean id="loteMicrosigaFacade" class="br.edu.unianhanguera.plt.agente.microsiga.business.LoteMicrosigaFacade"/>
    <bean id="itemMicrosigaFacade" class="br.edu.unianhanguera.plt.agente.microsiga.business.ItemMicrosigaFacade"/>
    <!--ACTIONS-->
    <bean name="/Welcome" class="br.edu.unianhanguera.plt.agente.action.WelcomeAction">
        <property name="loteMicrosigaFacade" ref="loteMicrosigaFacade" />
    </bean>
</beans>

Alguém tem uma idéia? o banco que eu uso é o MS SQL Server

2 Respostas

L

linha 6: JTA TransactionManager not available

Um Tomcat ou um Jetty não vem com JTA, só em servidores de aplicações como JBoss ou Glassfish.

Das duas uma: ou você configura o Spring para usar transação local, ou usa um servidor de aplicação. Se você não reparou, o código XML tx:jta-transaction-manager/ diz para o Spring para procurar uma transação JTA que, muito provavelmente, não existe.

P.S.: Seja qual for a opção utilizada para resolver o problema, recomendo procurar no Google antes.

ralphsilver

Leonardo3001:
linha 6: JTA TransactionManager not available

Um Tomcat ou um Jetty não vem com JTA, só em servidores de aplicações como JBoss ou Glassfish.

Das duas uma: ou você configura o Spring para usar transação local, ou usa um servidor de aplicação. Se você não reparou, o código XML tx:jta-transaction-manager/ diz para o Spring para procurar uma transação JTA que, muito provavelmente, não existe.

P.S.: Seja qual for a opção utilizada para resolver o problema, recomendo procurar no Google antes.

Leonardo,

Utilizo o Glassfish como application server

Criado 13 de agosto de 2009
Ultima resposta 13 de ago. de 2009
Respostas 2
Participantes 2