2
respostas

Problema com pluguin Vraptor-JPA e transações

Olá, configurei meu projeto com o Pluguin do Vraptor-JPA que por padrão abre uma transação a cada requisição. Quando deixo o pluguin com esse comportamento padrão tudo funciona, porém eu desejo que apenas os métodos marcados com @Transactional (javax.transaction.Transactional ?) sejam transacionais de fato. Configurei o meu beans.xml de acordo com o próprio site do plugim, mas acontece que parece que não está sendo feito o commit das transações, eu salvo e tal mas as modificações não são persistidas, qual será o problema?

meu beans.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans     xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
                            http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
        version="1.1" bean-discovery-mode="annotated">    
<scan>
    <exclude name="com.google.common.util.concurrent.MoreExecutors$SameThreadExecutorService"></exclude>
</scan>
<decorators>
    <class>br.com.caelum.vraptor.jpa.TransactionDecorator</class>
</decorators>
</beans>

Meu repositório:

@RequestScoped
public class Blocos {

    @Inject
    private EntityManager em;

    @Transactional
    public Bloco adicionar(Bloco bloco){
        em.persist(bloco);
        return bloco;
    }

    @Transactional
    public Bloco modificar(Bloco bloco){
        em.merge(bloco);
        return bloco;
    }

    public Bloco recuperar(Long blocoId){

        Bloco bloco =  em.find(Bloco.class, blocoId);
        return bloco;
    }
}

e por fim o meu Pom:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>br.com.tropicalshoping</groupId>
    <artifactId>ROOT</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
    <dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
<scope>provided</scope>
  </dependency>
        <dependency>
            <groupId>org.jboss.weld.se</groupId>
            <artifactId>weld-se-core</artifactId>
            <version>2.1.1.Final</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <dependency>
    <groupId>com.thetransactioncompany</groupId>
    <artifactId>cors-filter</artifactId>
    <version>2.4</version>
</dependency>
        <dependency>
            <groupId>br.com.caelum</groupId>
            <artifactId>vraptor</artifactId>
            <version>4.2.0-RC5</version>
        </dependency>

<dependency>
    <groupId>br.com.caelum.vraptor</groupId>
    <artifactId>vraptor-simplemail</artifactId>
    <version>4.1.0-RC4</version>
</dependency>


<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-email</artifactId>
    <version>1.4</version>
</dependency>



    <!--     
<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-log4j12</artifactId>
    <version>1.7.5</version> 
</dependency>
 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-validator-cdi</artifactId>
            <version>5.1.1.Final</version>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-entitymanager</artifactId>
            <version>4.3.0.Final</version>
        </dependency>


        <dependency>
            <groupId>org.jboss.weld.servlet</groupId>
            <artifactId>weld-servlet</artifactId>
            <version>2.1.1.Final</version>
        </dependency>
        <dependency>
            <groupId>javax.el</groupId>
            <artifactId>el-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.0</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.6.0</version>
        </dependency>
        <dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.3</version>
</dependency>
<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.8</version>
</dependency>
<!-- Pool de conexoes com C3P0 -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>4.3.8.Final</version>
            <scope>compile</scope>
        </dependency>


        <dependency>
    <groupId>br.com.caelum.vraptor</groupId>
    <artifactId>vraptor-jpa</artifactId>
    <version>4.0.2</version> <!-- or the latest version -->
</dependency>
2 respostas

Beleza Ricardo?

De fato, ao colocar a depêndencia vraptor-jpa todas suas transações por padrão deveriam abrir e fechar uma transação e ao configurar o beans.xml com esse decorator, apenas as transações com @Transactional deveriam ser gerenciadas pela dependencia.

Respondendo uma de suas dúvidas, os dados não estão sendo persistidos no banco exatamente pq não tem nenhum transação aberta. O que é estranho, já que seu método está anotado com @Transactional.

Tente primeiro adicionar ao @Transactional o parâmetro requires_new. Eu não lembro direito como fica exatamente, mas é algo assim:

@Transactional(TxType.REQUIRES_NEW), algo assim.

Se não funcionar, faça um teste para mim. Remova o decorator que vc adicionou no seu beans.xml e teste um método sem @transactional e ve o que acontece, se nada for persistido, significa q a dependencia não está criando uma transação para cada método.

Valeu, bons estudos!

Olá, então quando não uso o decorator e sigo o comportamento padrão do pluguin tudo funciona.

Quando ativo o decorator , os métodos anotados com @Transactional não persistem nada e não adiantou colocar o Requires New, tenho o mesmo resultado.

Isso não seria algum bug no plugin?