2011-12-08 2 views
4

(UserTransaction을 사용하여) BMT에서 다른 상태 비 저장 EJB에서 메소드를 호출합니다. 이 트랜잭션을 롤백 할 때 EJB 메소드에서 생성 된 엔티티는 롤백되지 않습니다. JPA 2.0과 함께 EJB 3.1을 사용합니다.stateless bean 호출로 JPA 트랜잭션 롤백이 실패합니다.

@Stateless 
@LocalBean 
@TransactionManagement(TransactionManagementType.BEAN) 
public class TaskExecutor { 

    @Inject private SomeEntityFacade someEntityEJB; 
    @Inject private RandomEJB randomEJB; 
    @Resource private UserTransaction ut; 

    @Asynchronous 
    public Future<String> doTheTransaction() { // we start here 

     try { 
      SomeEntity someEntity = new SomeEntity(); 
      someEntityEJB.create(someEntity); // this entity is rolled back 

      // call another EJB to create a SomeEntity, this entity is not rolled back 
      randomEJB.createSomeEntity(); 

      // cause error for test 
      int i = 5/0; 

      ut.commit(); 
     } catch (java.lang.ArithmeticException e) { 
      ut.rollback(); 
     } 
    } 
    // Omitted exceptions thrown by UserTransaction methods because they give no problems 
} 

RandomEJB : 트랜잭션이 방법 doTheTransaction()에서 시작 당신이 관심이 있다면

@Stateless 
@LocalBean 
public class SomeEntityFacade { 

    @PersistenceContext(unitName = "com.mysite.PU") 
    private EntityManager em; 

    public void create (SomeEntity p_someEntity) { 
     em.persist(p_someEntity); 
    } 

은 이것이다 :

@Stateless 
@LocalBean 
@TransactionManagement(TransactionManagementType.BEAN) 
public class RandomEJB { 

    @Inject private SomeEntityFacade someEntityEJB; 

    public void createSomeEntity() { 
     // same code to create entity as in TaskExecutor: 
     SomeEntity someEntity = new SomeEntity(); 
     someEntityEJB.create(someEntity); 
    } 
} 

가 완료하려면, 여기 SomeEntity의 필수적인 부분입니다 내 persistence.xml :

<?xml version="1.0" encoding="UTF-8"?> 
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"> 
    <persistence-unit name="com.mysite.PU" transaction-type="JTA"> 
    <jta-data-source>jdbc/myDatabase</jta-data-source> 
    <properties></properties> 
    </persistence-unit> 
</persistence> 

RandomEJB에서 생성 된 엔티티가 롤백되지 않는 이유는 무엇입니까? 트랜잭션 내부에서 직접 생성 된 엔티티는?

아마도 this post과 관련되어 있지만 실제로 주어진 답을 이해하지 못합니다.

편집 : 오류 : 주석 RandomEJB@TransactionManagement(TransactionManagementType.BEAN)을 주석으로 추가했습니다. 내 이해 BMT 트랜잭션을 다른 BMT 주석 된 메서드를 통해 전파되는 대신 새 트랜잭션이 만들어집니다. 첫 번째 트랜잭션이 실패하고 롤백 될 수있는 동안 성공할 수 있습니다. BMT/CMT 주석이 달린 메서드를 사용할 때는주의해야합니다. 누군가 이것을 확인할 수 있습니까?

+0

"나의 이해는 BMT 트랜잭션이 다른 BMT 주석 방법을 통해 전파되지 않고 새로운 트랜잭션이 생성되는 것입니다." 아니! BMT이기 때문에 명시 적으로 직접 만들지 않으면 생성되지 않습니다. 그것은 어떤 트랜잭션없이 실행될 것이라고 말하는 것이 더 합리적입니다. –

답변

3

BMT bean은 서로 트랜잭션을 공유하지 않습니다.

즉, 다른 BMT에서 명시 적으로 시작한 트랜잭션을 재사용 할 수 없습니다. BMT는 "나는 게임이 무엇인지 알고 있으며, 나는 거래 물건을 직접 관리 할 것"과 같습니다.

그래서 :

  • BMT를 -> CMT 거래 (CMT는 실제 트랜잭션을 사용합니다 - -이 컨테이너의 경우는 상관하지 않는다> BMT는 하지 거래
  • BMT를 공유합니다 시작 또는 사용자 시작 - 트랜잭션이 존재한다는 사실에 관심이 있습니다.
관련 문제