2017-12-17 14 views
3

ストアドプロシージャを呼び出すことによって、ejbメソッドで非同期トランザクションアクションを実行します。私は、エラーの下に与えるmethot呼び出すとき:persistence.xmlのJTA EntityManagerはストアドプロシージャコールでgetTransaction()を使用できません

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0"> 
    <persistence-unit name="FileSearchPU" transaction-type="JTA"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <jta-data-source>jdbc/FileSearchDS</jta-data-source> 
     <properties> 
      <property name="hibernate.show_sql" value="true"/> 
      <property name="hibernate.format_sql" value="true"/> 
      <property name="hibernate.transaction.jta.platform" 
         value="${hibernate.transaction.jta.platform}"/> 
     </properties> 
    </persistence-unit> 
</persistence> 

@Stateless 
public class FileSearchDAO { 
    private static Logger logger = LoggerFactory.getLogger(FileSearchDAO.class); 

    @PersistenceContext(unitName = "FileSearchPU") 
    private EntityManager entityManager; 

    @Asynchronous 
    public Future<String> saveFile(String fileNo, List<String> runningFiles) { 
     try { 
      entityManager.getTransaction().begin(); 
      entityManager.createNativeQuery(
        " BEGIN prc_save_file (:fileNo); END;") 
        .setParameter("fileNo", fileNo).executeUpdate(); 
      entityManager.getTransaction().commit(); 
      runningFiles.remove(fileNo); 
      return new AsyncResult<>(fileNo); 
     } catch (Exception ex) { 
      ex.printStackTrace(); 
      return new AsyncResult<>(ex.getMessage()); 
     } 
    } 

java.lang.IllegalStateException: A JTA EntityManager cannot use getTransaction() 

を私は任意のEntityクラスを持っていません。私はちょうどいくつかのテーブルを更新するストアドプロシージャを呼び出したい。

答えて

3

JTAでは、マネージドデータソースコンテナはトランザクションを分散して処理するため、たとえばアプリケーションの外部で並行処理を処理します。

EntityManager sトランザクションはローカルトランザクションなので、トランザクションは使用できません。したがって、アプリケーションの外部では処理されません。詳細については、this postもお読みください。あなたがトランザクションを必要とする場合

あなたの注釈あなたの豆

@TransactionManagement(TransactionManagementType.BEAN) 

utx.begin(); 
    ... 
utx.commit(); // utx.rollback(); 
+1

おかげのようなトランザクションを使用し、それを使用するにはUserTransaction

@Resource UserTransaction utx; 

を使用する必要があります。 em.joinTransaction()も必要ですか? –

+1

@ mohammad_1m2永続コンテキストがストアドプロシージャで何が起こっているのか分からない可能性があるので、必要ではないか、あなたのケースでは問題ではないと思います。しかし、エンティティを処理している場合は、そうです。まだ使用しても害にならないと思います。 – pirho

関連する問題