2010-11-28 51 views
0

comme je managed bean dans mon application Java EE 6:Transaction pas créé automatiquement même si @TransactionAttribute (TransactionAttributeType.REQUIRES_NEW) est utilisé

@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"; 
    } 
} 

Pour autant que je comprends @TransactionAttribute, nouvelle transaction devrait être automatiquement créé. Mais apparemment, il ne l'est pas, parce que je reçois une exception:

Mon unité de persistance a l'attribut transaction-type="JTA". J'utilise JBoss 6 cr1.

Répondre

1

@TransactionAttribute est une annotation EJB. Je ne crois pas que le conteneur CDI offre la gestion des transactions comme le fait le conteneur EJB.

Une solution pour votre cas serait de mettre la fonctionnalité d'accès de base de données dans un EJB sans état et injecter que dans RegistrationBean. Cela étant dit, vous n'avez pas besoin de spécifier TransactionAttributeType.REQUIRES_NEW pour obtenir une gestion automatique des transactions. La valeur par défaut implicite, REQUIRES, devrait suffire sauf si vous envisagez d'appeler la méthode EJB à partir de la méthode exécutant une autre transaction, et que vous souhaitez que la méthode appelée s'exécute dans une transaction distincte de l'original.

4

Ce que vous essayez de faire est de ne pas tout à fait correct. Ce que vous avez défini est un bean CDI simple, qui ne prend pas en charge nativement l'annotation @TransactionAttribute. Cette annotation est à utiliser avec un bean EJB, que vous obtiendrez en utilisant l'annotation @Stateless.

Notez que dans ce cas, vous ne doivent pas nécessairement utiliser l'annotation TransactionAttribute (TransactionAttributeType.REQUIRES_NEW). Par défaut, vous obtenez déjà TransactionAttributeType.REQUIRES lorsque vous annotez votre bean avec @Stateless, ce qui, dans la plupart des cas, est ce que vous voulez.

1

Par défaut, le CDI ne prend pas en charge les transactions gérées par des conteneurs. Cependant, en utilisant le module Seam 3 Persistence, vous pouvez ajouter le support CMT à votre application.

La documentation Seam La persistance est ici ->Link

Tout d'abord, ajoutez les pots Seam Persistence à votre projet:

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

Ensuite, activez la gestion déclarative des transactions dans votre 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> 

Maintenant, selon la documentation, vous devriez pouvoir utiliser le @TransactionA Attribuez des annotations avec votre bean géré comme vous le feriez avec un EJB, cependant, je ne pouvais pas le faire fonctionner. Au lieu de cela, cependant, vous pouvez utiliser l'annotation @Transactional sur votre classe ou méthode. C'est l'équivalent Seam Persistence et fonctionne bien.

Espérons que cela aide. Des questions, il suffit de demander.

0

TransactionAttributeType.REQUIRE * D *