domingo, 5 de novembro de 2017

SessionFactory do Hibernate com CDI

Nesse artigo mostro como produzir e injetar uma SessionFactory do Hibernate usando CDI.

As tecnologias e ferramentas utilizadas nesse exemplo são:
  • Netbeans 8.2
  • JDK 8.0.151
  • Maven 3.3.9
  • Tomcat 8.0.27.0
  • JavaEE 7
  • JSF 2.2.14
  • Primefaces 6.1
  • Weld-Servlet 2.4.5
  • PostgreSql 9.5.4 Driver JDBC 9.4.1212
  • Hibernate Core 5.2.12
  • Hibernate C3p0 5.2.12
Estrutura do projeto:


Arquivo pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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>com.dnn</groupId>
    <artifactId>session-hibernate-cdi</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>session-hibernate-cdi</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
   
    <dependencies>
        <!-- implementação do JSF -->
        <dependency>
            <groupId>org.glassfish</groupId>
            <artifactId>javax.faces</artifactId>
            <version>2.2.14</version>
        </dependency>
        <!-- biblioteca de componentes do Primefaces  -->
        <dependency>
            <groupId>org.primefaces</groupId>
            <artifactId>primefaces</artifactId>
            <version>6.1</version>
        </dependency>
        <!-- nucleo do hibernate -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.2.12.Final</version>
        </dependency>
         <!-- pool de conexoes -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-c3p0</artifactId>
            <version>5.2.12.Final</version>
        </dependency>
         <!-- driver jdbc do postgresql -->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>9.4.1212</version>
        </dependency>
         <!-- biblioteca do javaee -->
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
        </dependency>
         <!-- implementação do cdi -->
        <dependency>
            <groupId>org.jboss.weld.servlet</groupId>
            <artifactId>weld-servlet</artifactId>
            <version>2.4.5.Final</version>
        </dependency>
    </dependencies>

    <build>
        <finalName>session-hibernate-cdi</finalName>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.7.0</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>  
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-war-plugin</artifactId>
                <version>3.2.0</version>
                <configuration>
                    <packagingExcludes>WEB-INF/web.xml</packagingExcludes>
                </configuration>
            </plugin>        
        </plugins>
    </build>   
</project>


Logica do projeto:

Ao iniciar a aplicação a classe SessionFactoryBuilder le o arquivo de configuração hibernate.cfg.xml com dados de acesso ao banco de dados PostgreSql e produz a SessionFactory .


A classe HibernateSF com escopo de requisição , injeta a SessionFactory e implementa os métodos de getCurretSession() e closeSession().


A interface Transactional sera um interceptador de transações implementada pela classe TransactionManger.

A classe TransactionManager gerencia os métodos do hibernate que requer transações como inserir,atualizar e excluir.


A classe FacesUtil possui métodos que cria mensagens que sera exibida para o usuário.


A classe AppContext implementa a ServletContextListennerque possui metodos que quando contexto é criado ou destruido,nesse caso quando o servidor Tomcat é finalizado a funcao contextDestroyed() ira limpar os drivers jdbc.

A classe Produto representa a tabela produto no banco de dados

A classe ProdutoDAO possui métodos de inserir,atualizar,excluir,recuperar e listar produtos atraves da SessionFactory injetada, note as anotacoes @Transactional nos metodos inserir,atualizar e excluir.

A classe ProdutoBean é um bean gerenciado vinculada a pagina index.xhtml com escopo de visão que gerencia produtos cadastrados podendo inserir,atualizar,excluir e listar.


A pagina index.xhtml possui componentes do Primefaces para gerenciar os produtos.



O arquivo web.xml fornece informações de configuração e de implementação para os componentes da aplicação web.

O arquivo context.xml é o arquivo de configuração de contexto do Tomcat.

O arquivo beans.xml  ativa o cdi



Resultado:





Nenhum comentário:

Postar um comentário