2012-06-09 1 views
16

비 ejb 응용 프로그램에 다음 코드를 어떻게 저장합니까? 코드가 작동합니다. JTA EntityManager는 getTransaction()을 사용할 수 없습니다.

@Override 
public void saveItems(Collection<T> items) { 
    synchronized (em) { 
     EntityTransaction tx = em.getTransaction(); 
     try { 
      tx.begin(); 
      for (T item : items) { 
       saveItem_((Class<T>) null, item); 
      } 
      tx.commit(); 
     } finally { 
      if (tx.isActive()) { 
       tx.rollback(); 
      } 
     } 
    } 
} 

는 새 응용 프로그램에서 나는 EJB3 + JSF를 사용하고 있는데 위의 코드를 포함하는 라이브러리를 다시 사용하고 싶습니다. 새 응용 프로그램에 대한 나의 peristence 단위는 다음과 같습니다

<persistence-unit name="myApp" transaction-type="JTA"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <jta-data-source>MySQLConnection</jta-data-source> 
    </persistence-unit> 

나의 새로운 응용 프로그램은이 선에 도달 할 때 예외를 발생 :

EntityTransaction tx = em.getTransaction(); 

예외가 있습니다 :

A JTA EntityManager cannot use getTransaction() 

어느를 충분 해. 문제는 컨테이너에서 트랜잭션을 관리하도록 코드를 변환하는 방법입니다. 아마 내 콩 메서드는 적절하게 주석을 추가해야 ... 질문은 어떻게?

답변

12

EntityTransaction은 리소스 유형이 로컬 인 엔터티 관리자와 함께 사용됩니다. JTA를 사용하려면 UserTransaction 인터페이스를 사용해야합니다.

출처 문서 : EntityTransaction - 리소스 로컬 엔터티 관리자에서 트랜잭션을 제어하는 ​​데 사용되는 인터페이스입니다. EntityManager.getTransaction() 메서드는 EntityTransaction 인터페이스를 반환합니다.


편집 : 추가 된 의사 코드.

@Resource 
private SessionContext sessionContext; 

void execute(){ 

UserTransaction userTxn = sessionContext.getUserTransaction(); 

try{ 

userTxn.begin(); 
/** 
    * do-something 
    */ 
userTxn.commit(); 

    } catch(Throwable e){ 
    userTxn.rollback(); //-- Include this in try-catch 
    } 
} 
+3

여기 해결책은 무엇입니까? – rtcarlson

+0

@rtcarlson 왜 downvoted & 나는'UserTransaction' 인터페이스를 사용하기 위해 내 게시물을 정리하지 않았습니다. –

+0

@downvoter 설명 할 수없고 이해할 수없는 경우 이유없이 다운볼트하지 마십시오. –

4

가장 간단한 경우에는 작동합니다. EntityManager를 EJB에 삽입하고 특별한 주석을 사용하지 않으면 입력 된 첫 번째 EJB 메소드에서 트랜잭션이 열립니다 (즉, EjbA가 EjbB를 호출하고 EjbC를 호출하면 모든 EJB 메소드에서 하나의 트랜잭션 만 사용됩니다). 트랜잭션을 제어하는 ​​방법을 수정하려면 @Transaction을 찾아보십시오.

롤백을 수행하는 가장 간단한 방법은 @ApplicationException 표시 예외가 발생하는 것입니다 (롤백 = TRUE)

내가 틀릴 수 있지만, 코드에서 판단하는 것은 당신이 EXTENDED과 NORMAL의 차이에 읽어해야 EntityManager. 당신이 매우 어색한 방식으로 확장 된 em을 사용하고있는 것처럼 보입니다. (트랜잭션에서 루프를 움직이면 마침내 제거 할 수 있습니다.)

작은 편집 : 당신이 UserTransaction을 사용하려고하면 다른 포스트에서 알 수 있듯이 표준의 EntityManager가 (당신은 아마 사용하고 있는지) 소위 CMT (컨테이너 관리 트랜잭션)을 사용하기 때문에이, 당신이 오류가 발생합니다. 응용 프로그램이 EntityManager를 관리 대

  • 컨테이너가 EntityManager를 관리,
  • 컨테이너 : 당신이 (당신이 원한다면, 내가 자세히 설명 할 수 있지만, 솔직히, 당신이 그것을 필요로하지 않을 것이다) 세 가지 기본 opositions을 이해하지 않는 한, 그것을 만지지 마십시오
  • NORMAL EntityManager 및 EXTENDED EntityManager.
관련 문제