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