CRUD Completo Com Hibernate e JPA
CRUD Completo Com Hibernate e JPA
CRUD Completo Com Hibernate e JPA
Trabalhar com manipulação de banco de dados tornou-se quase que obrigatório para qualquer
sistema, do mais simples ao mais complexo. Até um tempo atrás tínhamos que usar técnicas e
ferramentas para realizar tais tarefa, muito conhecidas como por exemplo o
Atualmente usamos frameworks ORM (Mapemanto Objeto-Relacional) que fazem toda a tarefa
que antes era feita manualmente. Em poucas palavras um Framework ORM é responsável por
abstrair um banco de dados relacional, permitindo que você trabalhe como se fosse um banco
de dados orientado à objetos, o que é ideal para quem trabalha com uma linguagem que já é
Neste artigo usaremos o Hibernate em conjunto com o JPA para criar um CRUD básico.
ORM, ou seja, a implementação física do que você usará para persistir, remover, atualizar ou
buscar dados no SGBD. Por outro lado, o JPA é uma camada que descreve uma interface
http://www.devmedia.com.br/crud-completo-com-hibernate-e-jpa/32711 1 de 15
CRUD completo com Hibernate e JPA
ORM, ou seja, a implementação física do que você usará para persistir, remover, atualizar ou
buscar dados no SGBD. Por outro lado, o JPA é uma camada que descreve uma interface
Você pode desenvolver todo seu sistema sem JPA, apenas com Hibernate ou qualquer outro
framework ORM, como o TopLink. Porém você não pode desenvolver o sistema apenas com
JPA, pois ele é apenas uma interface a ser utilizada por Frameworks ORM.
A ideia geral é tornar o sistema o mais abstrato possível e passível de mudanças sem grandes
impactos. Se você desenvolver todo seu sistema usando JPA com o framework Hibernate e
Crie um projeto Java normal, independente da IDE que você estiver usando. Precisamos, antes
hibernate-entitymanager-4.2.19.Final.jar
antlr-2.7.7.jar
dom4j-1.6.1.jar
hibernate-commons-annotations-4.0.2.Final.jar
hibernate-core-4.2.19.Final.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
javassist-3.18.1-GA.jar
jboss-logging-3.1.0.GA.jar
jboss-transaction-api_1.1_spec-1.0.1.Final.jar
postgresql-9.1-903.jdbc4.jar
Na opção código fonte, no topo desse post encontrará todas essas bibliotecas para downloads.
Feita a adição das bibliotecas no classhpath do seu projeto, você precisará de um arquivo
chamado persistence.xml que é usado pelo JPA para realizar as configurações importantes
http://www.devmedia.com.br/crud-completo-com-hibernate-e-jpa/32711 2 de 15
CRUD completo com Hibernate e JPA
Feita a adição das bibliotecas no classhpath do seu projeto, você precisará de um arquivo
chamado persistence.xml que é usado pelo JPA para realizar as configurações importantes
para o projeto, tais como: conexão com o banco de dados e outras configurações extras que
veremos na Listagem 1.
Listagem 1. persistence.xml
através da propriedade name que em nosso caso é crudHibernatePU. Esse nome será usado
programaticamente para que o JPA saiba quais são as configurações que ele deve usar, como
A tag provider identifica qual o framework que estamos utilizando em conjunto com o JPA, no
nosso caso é o Hibernate. Abaixo temos várias tags <property>, a hibernate.dialect define um
dialeto padrão para escrita de comandos SQL e o jdbc.driver define qual o driver do banco que
Nas três últimas propriedades temos o link de conexão ao banco, o usuário e finalmente a
senha. Para quem já trabalhou com o DriverManager vai notar uma pequena semelhança com
http://www.devmedia.com.br/crud-completo-com-hibernate-e-jpa/32711 3 de 15
CRUD completo com Hibernate e JPA
senha. Para quem já trabalhou com o DriverManager vai notar uma pequena semelhança com
Esta propriedade apresentada configura o que o Hibernate deve fazer com o banco de dados
ao ser iniciado. No caso acima estamos definindo o seu valor como “update”, isso significa que
toda vez ao iniciar a nossa aplicação o Hibernate irá checar por alterações entre o mapeamento
e o banco de dados, como uma propriedade adicionada em uma classe. Quando é encontrada
alguma alteração então o Hibernate executa o DDL para atualizar o banco de dados.
É muito importante ter cuidado quando esta propriedade estiver sendo usada pois ela pode
alterar o banco de dados de uma forma que você não desejava, por isso tenha certeza de que
Você deve criar um diretório chamado META-INF e colocar dentro do diretório src. Dentro do
O próximo passo é criar uma classe DAO (Data Access Object) que fará a comunicação com o
banco de dados, realizando as operações básicas (CRUD). Toda a chamada para da aplicação
será feita para nosso DAO que se responsabilizará pela comunicação com o banco de dados.
Nosso DAO irá fazer CRUD com uma classe chamada Cliente, para isso vejamos como mapear
package br.com.crudhibernate;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
http://www.devmedia.com.br/crud-completo-com-hibernate-e-jpa/32711
@Table(name = "cliente") 4 de 15
CRUD completo com Hibernate e JPA
@Entity
@Table(name = "cliente")
public class Cliente {
@Id
private int id;
@Column
private String nome;
@Column
private String cpf;
@Column
private String rg;
Além da criação padrão da classe Cliente que possui os atributos id, nome, CPF e RG com os
seus respectivos getters e setters, temos também algumas anotações definidas pelo JPA:
@Entity
@Table(name = "cliente")
public class Cliente {
A anotação @Entity faz com que o JPA saiba que aquela classe deve ser manipulada por ele, e
http://www.devmedia.com.br/crud-completo-com-hibernate-e-jpa/32711 5 de 15
CRUD completo com Hibernate e JPA
A anotação @Entity faz com que o JPA saiba que aquela classe deve ser manipulada por ele, e
a anotação @Table define que esta classe possui uma tabela chamada “cliente” no banco de
dados.
O primeiro atributo “id” é uma chave primaria e precisamos obrigatoriamente definir a anotação
@Id para que o JPA não apresente erros ao tentar inicializar a aplicação, as próximas
propriedades possuem a anotação @Column que descrevem que estas propriedades possuem
Você nem precisa ter criado a tabela cliente com estas colunas, apenas precisa ter o banco de
dados em execução. Quando a aplicação for inicializada o próprio JPA irá se responsabilizar
por criar essa tabela com suas colunas caso ela não exista, isso porque estamos usando o
Definida a nossa classe Cliente, podemos construir a classe DAO responsável por fazer a
package br.com.crudhibernate;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
return instance;
}
private ClienteJpaDAO() {
entityManager = getEntityManager();
}
http://www.devmedia.com.br/crud-completo-com-hibernate-e-jpa/32711 6 de 15
CRUD completo com Hibernate e JPA
entityManager = getEntityManager();
}
return entityManager;
}
@SuppressWarnings("unchecked")
public List<Cliente> findAll() {
return entityManager.createQuery("FROM " + Cliente.class.getName()).getRes
}
entityManager.getTransaction().rollback();
}
}
Nossa classe ClienteJpaDAO segue o padrão de projeto Singleton que garante que apenas
uma instância dessa classe será criada durante toda a aplicação. Ao realizar a criação da
classe pela primeira vez o método getEntityManager() é chamado, responsável por criar uma
instância de EntityManager.
disso verificamos se o atributo entityManager é nulo, ou seja, nunca foi criado, sendo assim
Tudo gira em torno do EntityManager, este é o nosso objeto principal para o CRUD. Feito isso e
entendido para que precisamos dele, podemos começar a criar os métodos que usarão tão
EntityManager passando o tipo da classe o id que deve ser buscado, já traz um objeto Cliente.
para só então hidratar um objeto Cliente com os dados do ResultSet, enfim o trabalho seria
http://www.devmedia.com.br/crud-completo-com-hibernate-e-jpa/32711 8 de 15
CRUD completo com Hibernate e JPA
para só então hidratar um objeto Cliente com os dados do ResultSet, enfim o trabalho seria
Este utiliza o createQuery que recebe um JPQL (Java Persistence Query Language) que é uma
alternativa ao SQL em forma de orientação a objetos, ou seja, você pode realizar as consultas
transação no commit(), dentro dessa transação é executado o método persist() que salva o
objeto cliente. Caso algum erro ocorra então um rollback() é executado e todas as alterações
são desfeitas.
O método merge segue o mesmo princípio do método persist(), a única diferença é que o
merge atualiza o registro e não apenas insere ele no banco. Mas se o registro não existir no
Seguindo o mesmo princípio dos outros o método remove() primeiro procura o cliente no banco
de dados para só então remover. O removebyId() recebe direto o id que deve ser removido
Vamos criar um formulário para realizar as operações de inserção, deleção, atualização e busca
http://www.devmedia.com.br/crud-completo-com-hibernate-e-jpa/32711 9 de 15
CRUD completo com Hibernate e JPA
Nosso formulário possui quatro campos básicos, aqueles definidos na nossa classe Cliente e
Vejamos as ações dos três botões, cada um em um método distinto, um ActionListener, como
mostra a Listagem 4.
chamamos o método clearFields() que limpa os campos para que o usuário possa preencher
que em nenhum momento estamos passando comandos SQL, HQL ou JPQL, e poderíamos
melhorar ainda mais o nível de acoplamento do nosso DAO permitindo que o CRUD seja
cliente e usar o método getById() para retornar o objeto Cliente hidratado. O método
Se você desejar usar o netBeans para construir o formulário, poderá usar o código “.form” da
<AuxValues>
<AuxValue name="FormSettings_autoResourcing" type="java.lang.Integer" value="0"/>
<AuxValue name="FormSettings_autoSetComponentName" type="java.lang.Boolean" value="false"
<AuxValue name="FormSettings_generateFQN" type="java.lang.Boolean" value="true"/>
<AuxValue name="FormSettings_generateMnemonicsCode" type="java.lang.Boolean" value="false
<AuxValue name="FormSettings_i18nAutoMode" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_layoutCodeTarget" type="java.lang.Integer" value="1"/>
<AuxValue name="FormSettings_listenerGenerationStyle" type="java.lang.Integer" value="0"/
<AuxValue name="FormSettings_variablesLocal" type="java.lang.Boolean" value="false"/>
<AuxValue name="FormSettings_variablesModifier" type="java.lang.Integer" value="2"/>
</AuxValues>
<Layout>
<DimensionLayout dim="0">
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<EmptySpace max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="jLabel1" alignment="0" min="-2" max="-2" attributes=
<Component id="jTextFieldID" alignment="0" min="-2" pref="242" max=
</Group>
<EmptySpace type="separate" max="-2" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="jLabel2" alignment="0" min="-2" max="-2" attributes=
<Component id="jTextFieldNome" alignment="0" min="-2" pref="242" ma
</Group>
<EmptySpace min="0" pref="0" max="32767" attributes="0"/>
</Group>
<Group type="102" attributes="0">
<Group type="103" groupAlignment="0" attributes="0">
<Component id="jLabel3" alignment="0" min="-2" max="-2" attributes=
<Component id="jTextFieldCpf" alignment="0" min="-2" pref="242" max
</Group>
<EmptySpace max="32767" attributes="0"/>
<Group type="103" groupAlignment="0" attributes="0">
<Component id="jLabel4" alignment="0" min="-2" max="-2" attributes=
<Component id="jTextFieldRg" alignment="0" min="-2" pref="242" max=
</Group>
</Group>
</Group>
<EmptySpace max="32767" attributes="0"/>
</Group>
<Group type="102" alignment="0" attributes="0">
<EmptySpace min="-2" pref="26" max="-2" attributes="0"/>
<Component id="jButtonSalvar" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="jButtonRemover" min="-2" max="-2" attributes="0"/>
<EmptySpace max="-2" attributes="0"/>
<Component id="jButtonBuscar" min="-2" max="-2" attributes="0"/>
<EmptySpace max="32767" attributes="0"/>
</Group>
</Group>
http://www.devmedia.com.br/crud-completo-com-hibernate-e-jpa/32711 12 de 15
CRUD completo com Hibernate e JPA
<Properties>
<Property name="name" type="java.lang.String" value="jTextFieldId" noResource="true"/
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parame
</Events>
</Component>
<Component class="javax.swing.JLabel" name="jLabel2">
<Properties>
<Property name="text" type="java.lang.String" value="Nome"/>
</Properties>
</Component>
<Component class="javax.swing.JTextField" name="jTextFieldNome">
<Properties>
<Property name="name" type="java.lang.String" value="jTextFieldNome" noResource="true
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="jLabel3">
<Properties>
<Property name="text" type="java.lang.String" value="CPF"/>
</Properties>
</Component>
<Component class="javax.swing.JTextField" name="jTextFieldCpf">
<Properties>
<Property name="name" type="java.lang.String" value="jTextFieldCpf" noResource="true"
</Properties>
</Component>
<Component class="javax.swing.JTextField" name="jTextFieldRg">
<Properties>
<Property name="name" type="java.lang.String" value="jTextFieldRg" noResource="true"/
</Properties>
</Component>
<Component class="javax.swing.JLabel" name="jLabel4">
<Properties>
<Property name="text" type="java.lang.String" value="RG"/>
</Properties>
</Component>
<Component class="javax.swing.JButton" name="jButtonSalvar">
<Properties>
<Property name="text" type="java.lang.String" value="Salvar"/>
<Property name="name" type="java.lang.String" value="jButtonSalvar" noResource="true"
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parame
</Events>
</Component>
<Component class="javax.swing.JButton" name="jButtonBuscar">
<Properties>
<Property name="text" type="java.lang.String" value="Buscar"/>
<Property name="name" type="java.lang.String" value="jButtonBuscar" noResource="true"
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parame
http://www.devmedia.com.br/crud-completo-com-hibernate-e-jpa/32711
</Events> 14 de 15
CRUD completo com Hibernate e JPA
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parame
</Events>
</Component>
<Component class="javax.swing.JButton" name="jButtonRemover">
<Properties>
<Property name="text" type="java.lang.String" value="Remover"/>
<Property name="name" type="java.lang.String" value="jButtonRemover" noResource="true
</Properties>
<Events>
<EventHandler event="actionPerformed" listener="java.awt.event.ActionListener" parame
</Events>
</Component>
</SubComponents>
</Form>
Neste artigo vimos como criar um CRUD usando o Hibernate e o JPA. Explicamos o passo a
passo desde a criação do projeto até a inserção, atualização, deleção ou busca de registros no
banco de dados.
A versão do Hibernate usado para este artigo foi a 4.2.19 final e o JPA 2.0, todas disponíveis na
http://www.devmedia.com.br/crud-completo-com-hibernate-e-jpa/32711 15 de 15