2017-12-17 32 views
3

저장 프로 시저를 호출하여 ejb 메서드에서 비동기 트랜잭션 작업을 수행하려고합니다. 나는 methot를 호출 할 때 나는 오류가 아래 제공 :JTA EntityManager는 저장 프로 시저 호출에서 getTransaction()을 사용할 수 없습니다.

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

@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()); 
     } 
    } 

에게이 persistence.xml에게

<?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> 

을 내가 어떤 엔티티 클래스를하지 않았습니다. 난 그냥 테이블을 업데이 트하는 저장 프로 시저를 호출하고 싶습니다.

답변

3

JTA에서 관리되는 데이터 소스 컨테이너는 트랜잭션을 분산 방식으로 처리하므로 예를 들어 애플리케이션 외부에서 동시성도 처리합니다.

EntityManager 트랜잭션이 로컬 트랜잭션이므로 응용 프로그램 외부에서 처리되지 않으므로 트랜잭션을 사용할 수 없습니다. 자세한 내용은 this post을 읽어보십시오. 당신이 거래를해야하는 경우

당신은 UserTransaction

@Resource 
UserTransaction utx; 

이 당신의 주석을 여러분의 빈

@TransactionManagement(TransactionManagementType.BEAN) 

사용

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

감사와 같은 트랜잭션을 사용하려면 사용해야합니다. em.joinTransaction()도 필요합니까? –

+1

@ mohammad_1m2 필자는 저장 프로 시저에서 발생하는 상황을 지속성 컨텍스트가 알지 못하기 때문에 필요하지 않거나 중요하지 않다고 생각합니다. 하지만 당신이 엔티티를 다루는 경우에 그렇습니다. 아직도 사용하면 해를 끼치 지 않을 것입니다. – pirho