Нет транзакции в процессе транзакции JTA - PullRequest
1 голос
/ 16 февраля 2012

Я новичок в JTA, и я хотел сделать двухфазную фиксацию в моем приложении, которая бы подключалась к двум различным схемам базы данных.Я использую Spring, Hibernate и JPA в своем приложении, и я хочу добавить менеджер транзакций JTA для начала, но я не смог пройти через это.

Может кто-нибудь, пожалуйста, помогите мне решить проблему, которую ясталкиваюсь или указываю на то, что неправильно в моей конфигурации или понимании.

Вот мои настройки в файле конфигурации

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="persistenceUnitName" value="LineManagement" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="generateDdl" value="false" />
            <property name="showSql" value="false" />
            <property name="databasePlatform" value="${hibernate.dialect}" />
        </bean>
    </property>
    <property name="beanName" value="entityManager"></property>
</bean>

<bean id="userTransactionService" class="com.atomikos.icatch.config.UserTransactionServiceImp"
    init-method="init" depends-on="setAtomikosSystemProps">
    <constructor-arg>
        <props>
            <prop key="com.atomikos.icatch.service">com.atomikos.icatch.standalone.UserTransactionServiceFactory</prop>
        </props>
    </constructor-arg>
</bean> 


<bean id="setAtomikosSystemProps" class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
    <property name="targetObject">
        <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean">
            <property name="targetClass" value="java.lang.System" />
            <property name="targetMethod" value="getProperties" />
        </bean>
    </property>
    <property name="targetMethod" value="putAll" />
    <property name="arguments">
        <util:properties>
            <prop key="com.atomikos.icatch.file">/jta.properties</prop>
            <prop key="com.atomikos.icatch.hide_init_file_path">true</prop>
            <prop key="com.atomikos.icatch.console_log_level">DEBUG</prop>
        </util:properties>
    </property>
</bean>

<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager" >
        <property name="userTransaction" ref="AtomikosUserTransaction" /> 
        <property name="transactionManager" ref="AtomikosTransactionManager" /> 
</bean>


<bean id="AtomikosUserTransaction" class="com.atomikos.icatch.jta.UserTransactionImp" depends-on="userTransactionService" >
    <property name="transactionTimeout" value="300"/>
</bean> 

<bean id="AtomikosTransactionManager" class = "com.atomikos.icatch.jta.UserTransactionManager" init-method="init" destroy-method="close">
   <property name="forceShutdown" value="false" /> 
</bean>


<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

Файл persistence.xml имеет следующую конфигурацию

<persistence-unit name="LineManagement" transaction-type="JTA">

    <properties>
        <property name="hibernate.id.new_generator_mappings" value="true" />
        <property name="hibernate.current_session_context_class" value="thread" />
        <property name="hibernate.default_batch_fetch_size" value="200" />
        <property name="hibernate.transaction.manager_lookup_class" value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup"/>
        <property key="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
        <!-- General Debugging -->
        <property name="hibernate.show_sql" value="false" />
        <property name="hibernate.format_sql" value="true" />
        <property name="hibernate.generate_statistics" value="true" />

    </properties>
</persistence-unit>

Когда я запускаю приложение, оно дает мнеисключение org.springframework.dao.InvalidDataAccessApiUsageException: транзакция не выполняется;Вложенное исключение - javax.persistence.TransactionRequiredException: транзакция не выполняется

Я попытался обойти флаг распространения в аннотации @Transactional, так как я считаю, что это исключение указывает на отсутствие транзакции, ноошибка не исчезла ...

1 Ответ

1 голос
/ 17 февраля 2012

Попробуйте поставить @Transactional с "Required" перед вызовом службы (или уровня постоянства). Убедитесь, что вы используете тот же диспетчер транзакций, который просматривается объявленным классом поиска диспетчера транзакций hibernate.

Как правило, ваш перехватчик весенней транзакции должен начинать транзакцию, прежде чем выполнять какую-либо операцию с БД, которая требует транзакции.

...