2016-05-26 7 views
2

Я хотел бы вызвать метод с Oracle ADFApplicationModule из @Transactional метода Spring Service, где я называю JPA EntityManager методы. Эти вызовы необходимо совершать в одной транзакции. Оба используют один и тот же DataSource, а мой сервер приложений - Weblogic 10.3.5. Как я могу достичь этого?Как получить общую транзакцию между Oracle ADF ApplicationModule и JPA в методе @Transactional Spring-сервиса?

Когда я использую JtaTransactionManager, мои изменения модуля приложения поручены, но изменения по JPA являются не. И когда я использую JpaTransactionManager, ApplicationModule изменений не фиксировано.

Это моя весна Config:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xmlns:jee="http://www.springframework.org/schema/jee" 
     xsi:schemaLocation="   
     http://www.springframework.org/schema/beans   
     http://www.springframework.org/schema/beans/spring-beans-3.2.xsd   
     http://www.springframework.org/schema/tx   
     http://www.springframework.org/schema/tx/spring-tx-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/mvc   
     http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd   
     http://www.springframework.org/schema/jee   
     http://www.springframework.org/schema/jee/spring-jee-3.2.xsd"> 
    <context:component-scan base-package="testspring.view"/> 
    <context:annotation-config/> 
    <mvc:annotation-driven/> 
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> 
     <property name="viewClass" 
        value="org.springframework.web.servlet.view.JstlView"/> 
     <property name="prefix" value="/WEB-INF/jsp/"/> 
     <property name="suffix" value=".jsp"/> 
    </bean> 
    <mvc:default-servlet-handler/> 
    <bean id="dataSource" name="dataSource" 
      class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiName" value="jdbc/hrDS"/> 
     <property name="resourceRef" value="true"/> 
    </bean> 
    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/> 
    <bean id="entityManagerFactory" 
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
     <property name="dataSource" ref="dataSource"/> 
     <property name="packagesToScan" value="testspring.model"/> 
     <property name="jpaVendorAdapter"> 
      <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
     </property> 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
       <prop key="javax.persistence.validation.mode">AUTO</prop> 
       <prop key="hibernate.archive.autodetection">class</prop> 
       <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop> 
       <prop key="hibernate.connection.charSet">UTF-8</prop> 
       <prop key="hibernate.connection.useUnicode">true</prop> 
       <prop key="hibernate.connection.characterEncoding">UTF-8</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.format_sql">true</prop> 
       <prop key="hibernate.transaction.flush_before_completion">true</prop> 
       <prop key="hibernate.transaction.auto_close_session">true</prop> 
       <prop key="hibernate.connection.release_mode">auto</prop> 
      </props> 
     </property> 
    </bean> 
    <bean id="transactionManager" 
      class="org.springframework.transaction.jta.JtaTransactionManager"></bean> 
    <tx:annotation-driven transaction-manager="transactionManager"/> 
</beans> 

Это мой Класс обслуживания:

package testspring.view; 

import javax.persistence.EntityManager; 
import javax.persistence.PersistenceContext; 

import oracle.jbo.client.Configuration; 

import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

import testspring.adfmodel.AppModuleImpl; 

import testspring.model.Regions; 


@Service 
public class HelloBS { 
    @PersistenceContext 
    private EntityManager entityManager; 

    public HelloBS() { 
     super(); 
    } 

    @Transactional() 
    public void doSomething() { 
     AppModuleImpl am = null; 
     String amDef = "testspring.adfmodel.AppModule"; 
     String config = "AppModuleLocal"; 

     am = (AppModuleImpl)Configuration.createRootApplicationModule(amDef, config); 
     am.insertRegions("ADF"); 

     Regions region = new Regions(); 
     region.setRegionName("JPA"); 
     entityManager.persist(region); 
    } 
} 

Что-то я хотел бы добавить, что я попробовал один и тот же сценарий, используя EJB Бобы и она работала отлично ,

ответ

0

Я упростил мой вопрос и удалил часть АПДА и отправил его в другом вопрос здесь: Why are JPA changes using an EntityManager not committed in a Spring Service when JtaTransactionManager is used?

После того, как помощь от @Bond - Java Бонд и еще несколько исследований я нашел ответ и отправил его на этот вопрос. Этот ответ также относится и к этому вопросу.

0

Что вы ищете - это совместное использование одного и того же java.sql.Connection между обеими средами.

Я не думаю, что вы можете передать соединение с ADF BC, так как AM управляют своими подключениями прозрачно, но вы можете использовать соединение, созданное ADF BC, и передать его Spring. Но я не уверен, что весна может работать так: вам нужно проверить людей с более поздним весенним опытом, чем я.

Что вы можете сделать, это, конечно, использовать ADF BC и JDBC в той же транзакции.

+0

На самом деле я использую декларативное и аннотационное управление транзакциями. Таким образом, я не могу передать соединение с моим JPA EntityManager. Как я уже говорил, он работал с EJB, и весной тоже должен быть. –

0

Можете ли вы переписать фиксацию своей части JPA, чтобы сначала передать часть ADF, и только если она работает, то передайте часть JPA?

Я не думаю, что вы можете использовать один менеджер транзакций для обоих. Единственное исключение может быть, если вы подвергаете свой AM как веб-службу и управляете транзакциями вызовов этого веб-сервиса извне.

+0

Я считаю, что должен быть способ использования специального вида «TransactionManager». Поэтому я предпочитаю не программировать его вручную. Другое решение, которое я собираюсь попробовать и могу помочь мне, - разоблачить 'ApplicationModule' как' EJB' и использовать его в Spring Service. Спасибо за ваш комментарий. –