2010-11-28 2 views
0

내 자바 EE 6 응용 프로그램에서 관리되는 콩이 : 지금까지 내가 @TransactionAttribute을 이해트랜잭션 @TransactionAttribute (TransactionAttributeType.REQUIRES_NEW)을 사용하는 경우에도 자동으로 만들어지지

@Named 
@RequestScoped 
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
public class RegistrationBean implements Serializable { 

    @PersistenceContext 
    EntityManager em; 

    public String doRegistration() { 
     MyEntity entity = new MyEntity(); 
     em.persist(entity); 
     return "view"; 
    } 
} 

, 새로운 트랜잭션이 자동으로되어야한다 만들어진. 하지만 예외가 발생하기 때문에 분명히 그렇지 않습니다. javax.persistence.TransactionRequiredException: EntityManager must be access within a transaction

내 영속 유닛의 속성은 transaction-type="JTA"입니다. 저는 JBoss 6 cr1을 사용하고 있습니다.

답변

1

@TransactionAttribute는 EJB 주석입니다. 나는 CDI 컨테이너가 EJB 컨테이너처럼 트랜잭션 관리를 제공한다고 생각하지 않는다.

당신의 경우에 대한 하나의 솔루션은 데이터베이스 액세스 기능을 무 상태 EJB에 넣고이를 RegistrationBean에 주입하는 것입니다. 즉, 자동 트랜잭션 처리를 위해 TransactionAttributeType.REQUIRES_NEW를 지정할 필요가 없습니다. 암시 적 기본값 인 REQUIRES는 다른 트랜잭션을 실행하는 메서드에서 EJB 메서드를 호출 할 계획이 아니라면 호출 된 메서드를 원본 트랜잭션과 별도로 실행하려는 경우가 아니면 안됩니다.

4

정확하게하려는 것이 아닙니다. 당신이 정의한 것은 @TransactionAttribute 어노테이션을 기본적으로 지원하지 않는 일반 CDI 빈이다. 이 주석은 @Stateless 주석을 사용하여 얻을 EJB 빈과 함께 사용됩니다.

이 경우 반드시 TransactionAttribute (TransactionAttributeType.REQUIRES_NEW) 주석을 사용할 필요는 없습니다. 기본적으로 @Stateless로 bean을 주석 처리 할 때 이미 TransactionAttributeType.REQUIRES를 얻고있다. 대부분의 경우 원하는 것이다.

1

기본적으로 CDI는 컨테이너 관리 트랜잭션을 지원하지 않습니다. 그러나 Seam 3 Persistence 모듈을 사용하면 응용 프로그램에 CMT 지원을 추가 할 수 있습니다.

심 지속성 문서는 여기 - 첫째>Link

, 프로젝트에 심 지속성 단지를 추가

<dependency> 
    <groupId>org.jboss.seam.persistence</groupId> 
    <artifactId>seam-persistence-api</artifactId> 
    <version>${seam.persistence.version}</version> 
</dependency> 

<dependency> 
    <groupId>org.jboss.seam.persistence</groupId> 
    <artifactId>seam-persistence-impl</artifactId> 
    <version>${seam.persistence.version}</version> 
</dependency> 

<dependency> 
    <groupId>org.jboss.seam.solder</groupId> 
    <artifactId>seam-solder</artifactId> 
    <version>${seam.solder.version}</version> 
</dependency> 

다음, beans.xml 환경에 선언적인 트랜잭션 관리를 가능하게

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation=" 
     http://java.sun.com/xml/ns/javaee 
     http://docs.jboss.org/cdi/beans_1_0.xsd"> 

    <interceptors> 
     <class>org.jboss.seam.persistence.transaction.TransactionInterceptor</class> 
    </interceptors> 
</beans> 

이제 문서에 따르면 @TransactionA를 사용할 수 있습니다. EJB를 사용하는 것처럼 관리되는 bean으로 주석을 추가 할 수는 있지만 작동시키지 못했습니다. 그러나 대신 클래스 또는 메소드에 @Transactional 주석을 사용할 수 있습니다. 이것은 Seam Persistence와 동등하며 정상적으로 작동합니다.

희망이 도움이됩니다. 질문이 있으면 그냥 물어보십시오.

0

TransactionAttributeType.REQUIRE * D *