segunda-feira, 2 de outubro de 2017

Usando JTA com PostgreSQL e injeção do EntityManager via CDI no Wildfly 10

Bom, nesse post vou mostrar as configurações necessárias para usar o Hibernate gerenciado pelo servidor de aplicações, sendo injetado via CDI em qualquer Classe Java que também seja gerenciada pelo CDI. Vou considerar que você possui um projeto Maven já criado e o jar JDBC do PosgreSQL já baixado.

Vou mostrar a configuração necessária no Wildfly 10 para criar a conexão com o PostgreSQL, depois a configuração do Hibernate no arquivo persistence.xml, e por fim a configuração de um produces do CDI para injetar a instância do EntityManager em qualquer classe necessária.

Vamos começar configurando o módulo do PostgreSQL no Wildfly. Aonde estiver instalado o seu servidor de aplicação, vá até o caminho: wildfly-10.1.0.Final\modules\system\layers\base\org. Veja que existem vários módulos dentro dessa pasta, nós vamos inserir o do PostgreSQL.

1 – Crie uma pasta chamada postgresql;
2 – Dentro dela crie uma chamada main;
3 – Dentro dessa pasta coloque o driver JDBC do PostgreSQL;
4 – Crie um arquivo chamado module.xml com o seguinte conteúdo:

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.0" name="org.postgresql">
  <resources>
        <resource-root path="postgresql-42.1.4.jar"/>
  </resources>
  <dependencies>
         <module name="javax.api"/>
         <module name="javax.transaction.api"/>
   </dependencies>
</module>

Atente que a única coisa que deve mudar é o que está em amarelo, e deve ser o nome exato do driver JDBC que você está usando e que colocou dentro da pasta.

Uma vez criado o módulo dentro do Wildfly, vamos usá-lo na configuração da conexão com o banco de dados no arquivo standalone.xml.

Dentro do arquivo standalone.xml do Wildfly, procure a sessão datasources, e acrescente o seguinte trecho:

<datasources>
<datasource jta="true" jndi-name="java:jboss/datasources/PedidoVenda" pool-name="PedidoVenda" enabled="true" use-java-context="true">
<connection-url>jdbc:postgresql://localhost:5432/seu_banco</connection-url>
<driver-class>org.postgresql.Driver</driver-class>
<driver>postgresql</driver>
<transaction-isolation>TRANSACTION_READ_COMMITTED</transaction-isolation>
<pool>
<min-pool-size>10</min-pool-size>
     <max-pool-size>100</max-pool-size>
           <prefill>true</prefill>
</pool>
<security>
<user-name>usuario</user-name>
           <password>senha</password>
</security>
</datasource>
</datasources>

E depois acrescente o trecho referente ao driver dentro da tag drivers:

<drivers>
<driver name="postgresql" module="org.postgresql" />
</drivers>

Pronto, a configuração do Wildfly já está pronta, vamos agora ao JPA (Hibernate), fazendo a configuração do persistence.xml. No seu projeto, dentro da pasta META-INF que fica em src\main\resources\META-INF\ crie o arquivo persistence.xml com o seguinte conteúdo:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
     xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    
     <persistence-unit name="NomeUnidadePersistencia" transaction-type="JTA">
          <provider>org.hibernate.ejb.HibernatePersistence</provider>
           <jta-data-source>java:jboss/datasources/PedidoVenda</jta-data-source>
           <properties>
                <property name="hibernate.hbm2ddl.auto" value="create" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="false"/>
            <property name="hibernate.use_sql_comments" value="false"/>
           </properties>
     </persistence-unit>
</persistence>

As propriedades de configuração podem mudar de acordo com suas necessidades, procure na documentação o que se adéqua ao seu caso, mas para o proposto atende as necessidades. Entre as tags jta-data-source do arquivo persistence.xml deve conter o nome definido no arquivo standalone.xml na tag datasource na propriedade jndi-name.

Resta agora apenas a configuração usando CDI para podermos injetar a classe em qualquer bean CDI do nosso projeto. Quando se usa EJB no projeto, basta ter a anotação @PersistenceContext do javax.persistence anotada sobre o propriedade EntityManager de um bean EJB que o containner já se encarrega do resto. Porém quando não estamos trabalhando com EJBs, temos que passar essa responsabilidade para a implementação do CDI.

Isso é feito criando um método produtor em uma classe, que para o CDI é uma forma de especificar um método responsável por criar a instância de alguma determinada classe que será injetada em algum momento. Os métodos produtores são necessários em casos onde a classe que queremos que seja injetada não é um bean CDI, como é o caso do EntityManager.

Abaixo segue o código da classe:

import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Disposes;
import javax.enterprise.inject.Produces;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceUnit;

@ApplicationScoped
public class EntityManagerProducer {

    @PersistenceUnit
    private EntityManagerFactory emf;

    public EntityManagerProducer() {
        this.emf = Persistence.createEntityManagerFactory"NomeUnidadePersistencia" );
    }

    @Produces
    @RequestScoped
    public EntityManager createEntityManager() {
        return emf.createEntityManager();
    }

    public void closeEntityMAnager( @Disposes EntityManager em ) {
        em.close();
    }

}

Pronto! Note que o nome passado no método createEntityMAnagerFactory é o mesmo definido no persistence.xml na propriedade name da tag persistence-unit. Com essas configurações já temos um EntityManager injetável em qualquer ponto da aplicação que seja gerenciada pelo CDI.


Nenhum comentário:

Postar um comentário