Beruflich Dokumente
Kultur Dokumente
CAPTULO 14
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancode 1/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
O Hibernate abstrai o seu cdigo SQL, toda a camada JDBC e o SQL ser gerado
em tempo de execuo. Mais que isso, ele vai gerar o SQL que serve para um
determinado banco de dados, j que cada banco fala um "dialeto" diferente dessa
linguagem. Assim h tambm a possibilidade de trocar de banco de dados sem ter
de alterar cdigo Java, j que isso fica de responsabilidade da ferramenta.
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancode 2/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
Vamos usar o JPA com Hibernate, ou seja, precisamos baixar os JARs no site do
Hibernate. O site oficial do Hibernate o www.hibernate.org, onde voc baixa a
ltima verso na seo ORM e Download.
Para usar o Hibernate e JPA no seu projeto necessrio colocar todos esses JARs
no classpath.
Para este captulo, continuaremos utilizar a classe que representa uma tarefa:
packagebr.com.caelum.tarefas.modelo;
publicclassTarefa{
privateLongid;
privateStringdescricao;
privatebooleanfinalizado;
privateCalendardataFinalizacao;
}
Criamos os getters e setters para manipular o objeto, mas fique atento que s
devemos usar esses mtodos se realmente houver necessidade.
Essa uma classe como qualquer outra que aprendemos a escrever em Java.
Precisamos configurar o Hibernate para que ele saiba da existncia dessa classe e,
desta forma, saiba que deve inserir uma linha na tabela Tarefa toda vez que for
requisitado que um objeto desse tipo seja salvo. Em vez de usarmos o termo
"configurar", falamos em mapear uma classe a tabela.
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancode 3/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
@Entity
publicclassTarefa{
@Id
@GeneratedValue
privateLongid;
privateStringdescricao;
privatebooleanfinalizado;
@Temporal(TemporalType.DATE)
privateCalendardataFinalizacao;
//mtodos...
}
Mas em que tabela essa classe ser gravada? Em quais colunas? Que tipo de
coluna? Na ausncia de configuraes mais especficas, o Hibernate vai usar
convenes: a classe Tarefa ser gravada na tabela de nome tambm Tarefa, e o
atributo descricao em uma coluna de nome descricao tambm!
@Column(name="data_finalizado",nullable=true)
privateCalendardataFinalizacao;
@Entity
@Table(name="tarefas")
publicclassTarefa{
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancode 4/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
Em qual banco de dados vamos gravar nossas Tarefass? Qual o login? Qual a
senha? O JPA necessita dessas configuraes, e para isso criaremos o arquivo
persistence.xml.
<persistencexmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchemainstance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
version="2.0">
<persistenceunitname="tarefas">
<!provedor/implementacaodoJPA>
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<!entidademapeada>
<class>br.com.caelum.tarefas.modelo.Tarefa</class>
<properties>
<!dadosdaconexao>
<propertyname="javax.persistence.jdbc.driver"
value="com.mysql.jdbc.Driver"/>
<propertyname="javax.persistence.jdbc.url"
value="jdbc:mysql://localhost/fj21"/>
<propertyname="javax.persistence.jdbc.user"
value="root"/>
<propertyname="javax.persistence.jdbc.password"
value=""/>
<!propriedadesdohibernate>
<propertyname="hibernate.dialect"
value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancode 5/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
<propertyname="hibernate.show_sql"value="true"/>
<propertyname="hibernate.format_sql"value="true"/>
<!atualizaobanco,geraastabelasseforpreciso>
<propertyname="hibernate.hbm2ddl.auto"value="update"/>
</properties>
</persistenceunit>
</persistence>
Para usar o JPA no nosso cdigo Java, precisamos utilizar sua API. Ela bastante
simples e direta e rapidamente voc estar habituado com suas principais classes.
Nosso primeiro passo fazer com que o JPA leia a nossa configurao: tanto o
nosso arquivo persistence.xml quanto as anotaes que colocamos na nossa
entidade Tarefa. Para tal, usaremos a classe com o mesmo nome do arquivo XML:
Persistence. Ela responsvel de carregar o XML e inicializar as configuraes.
Resultado dessa configurao uma EntityManagerFactory:
EntityManagerFactoryfactory=
Persistence.createEntityManagerFactory("tarefas");
Estamos prontos para usar o JPA. Antes de gravar uma Tarefa, precisamos que
exista a tabela correspondente no nosso banco de dados. Em vez de criarmos o
script que define o schema (ou DDL de um banco, data definition language) do
nosso banco (os famosos CREATETABLE....) podemos deixar isto a cargo do
prprio Hibernate. Ao inicializar a EntityManagerFactory tambm j ser gerada
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancode 6/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
uma tabela Tarefas pois configuramos que o banco deve ser atualizada pela
propriedade do Hibernate: hbm2ddl.auto.
Caso voc esteja fazendo esse passo de casa. preciso baixar o ZIP do Hibernate
ORM 4.x (http://hibernate.org), extra-lo, e copiar todos os JARs das pastas
lib/required e lib/jpa.
antlr-2.7.7.jar
dom4j-1.6.1.jar
hibernate-commons-annotations-4.0.4.Final.jar
hibernate-core-4.3.0.Final.jar
hibernate-entitymanager-4.3.0.Final.jar
hibernate-jpa-2.1-api-1.0.0.Final.jar
jandex-1.1.0.Final.jar
javassist-3.18.1-GA.jar
jboss-logging-3.1.3.GA.jar
jboss-logging-annotations-1.2.0.Beta1.jar
jboss-transaction-api_1.2_spec-1.0.0.Final.jar
a. V ao diretrio caelum/21/jarsjpa/hibernate;
b. Selecione todos os JARs, clique com o boto direito e escolha Copy (ou CTRL+C);
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancode 7/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
2. Anote a classe Tarefa como uma entidade de banco de dados. Lembre-se que
essa uma anotao do pacote javax.persistence.
@Entity
publicclassTarefa{
Na mesma classe anote seu atributo id como chave primria e como campo de
gerao automtica:
@Id
@GeneratedValue
privateLongid;
@Temporal(TemporalType.DATE)
privateCalendardataFinalizacao;
3.
a. Clique com o boto direito na pasta src do projeto do fj21tarefas e escolha New
-> Folder. Escolha META-INF como nome dessa pasta.
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancode 8/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
<persistenceunitname="tarefas">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>br.com.caelum.tarefas.modelo.Tarefa</class>
<properties>
<propertyname="javax.persistence.jdbc.driver"
value="com.mysql.jdbc.Driver"/>
<propertyname="javax.persistence.jdbc.url"
value="jdbc:mysql://localhost/fj21"/>
<propertyname="javax.persistence.jdbc.user"value="root"/>
<propertyname="javax.persistence.jdbc.password"value=""/>
<propertyname="hibernate.dialect"
value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
<propertyname="hibernate.show_sql"value="true"/>
<propertyname="hibernate.format_sql"value="true"/>
<propertyname="hibernate.hbm2ddl.auto"value="update"/>
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancode 9/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
</properties>
</persistenceunit>
As duas propriedades show_sql e format_sql fazem com que todo SQL gerado pelo
Hibernate aparea no console.
packagebr.com.caelum.tarefas.jpa;
//importsomitidos
publicclassGeraTabelas{
publicstaticvoidmain(String[]args){
EntityManagerFactoryfactory=Persistence.
createEntityManagerFactory("tarefas");
factory.close();
}
}
5. Crie sua tabela executando a classe GeraTabelas. Para isso, clique da direita no
cdigo e v em Run As -> Java Application.
6. Agora, abra uma nova aba no Terminal e digite mysql -u root. Aps isto, digite
use fj21; e em seguida, show tables;. Se seu banco de dados j existia, e no foi
preciso cri-lo no passo anterior, voc ir notar a presena de uma tabela
chamada tarefas. No esta a tabela que queremos. Procuramos pela tabela
Tarefa, com T, em maisculo (igual ao nome da classe Tarefa).
7. (opcional) Caso algum erro tenha ocorrido, possvel que o Hibernate tenha
logado uma mensagem, mas voc no a viu dado que o Log4J no est configurado.
Mesmo que tudo tenha ocorrido de maneira correta, muito importante ter o
Log4J configurado.
Para isso, adicione no arquivo log4j.properties dentro da pasta src para que todo
o log do nvel info ou acima seja enviado para o console appender do System.out
(default do console):
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancod 10/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
log4j.logger.org.hibernate=info
EntityManagerFactoryfactory=
Persistence.createEntityManagerFactory("tarefas");
EntityManagermanager=factory.createEntityManager();
manager.close();
factory.close();
Tarefatarefa=newTarefa();
tarefa.setDescricao("EstudarJPA");
tarefa.setFinalizado(true);
tarefa.setDataFinalizacao(Calendar.getInstance());
EntityManagerFactoryfactory=
Persistence.createEntityManagerFactory("tarefas");
EntityManagermanager=factory.createEntityManager();
manager.getTransaction().begin();
manager.persist(tarefa);
manager.getTransaction().commit();
System.out.println("IDdatarefa:"+tarefa.getId());
manager.close();
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancode 11/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
http://bit.ly/bRc5g
Esses detalhes do dia a dia assim como JPA com Hibernate avanado so
vistos no curso FJ-25 da Caelum, de Hibernate e JPA avanados.
Carregar um objeto
Para buscar um objeto dada sua chave primria, no caso o seu id, utilizamos o
mtodo find, conforme o exemplo a seguir:
EntityManagerFactoryfactory=
Persistence.createEntityManagerFactory("tarefas");
EntityManagermanager=factory.createEntityManager();
Tarefaencontrada=manager.find(Tarefa.class,1L);
System.out.println(encontrada.getDescricao());
packagebr.com.caelum.tarefas.jpa;
//importsomitidos
publicclassAdicionaTarefa{
publicstaticvoidmain(String[]args){
Tarefatarefa=newTarefa();
tarefa.setDescricao("EstudarJPAeHibernate");
tarefa.setFinalizado(true);
tarefa.setDataFinalizacao(Calendar.getInstance());
EntityManagerFactoryfactory=Persistence.
createEntityManagerFactory("tarefas");
EntityManagermanager=factory.createEntityManager();
manager.getTransaction().begin();
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancod 12/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
manager.persist(tarefa);
manager.getTransaction().commit();
System.out.println("IDdatarefa:"+tarefa.getId());
manager.close();
}
}
mysqluroot
usefj21;
select*fromTarefa;
packagebr.com.caelum.tarefas.jpa;
//importsomitidos
publicclassCarregaTarefa{
publicstaticvoidmain(String[]args){
EntityManagerFactoryfactory=Persistence.
createEntityManagerFactory("tarefas");
EntityManagermanager=factory.createEntityManager();
Tarefaencontrada=manager.find(Tarefa.class,1L);
System.out.println(encontrada.getDescricao());
manager.close();
}
}
Caso recebeu uma exception, verifique o id da tarefa. Ele deve existir no banco.
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancod 13/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
EntityManagermanager=//abrirumEntityManager
Tarefaencontrada=manager.find(Tarefa.class,1L);
manager.getTransaction().begin();
manager.remove(encontrada);
manager.getTransaction().commit();
Tarefatarefa=newTarefa();
tarefa.setId(2);//esseidjexistenobanco
tarefa.setDescricao("EstudarJPAeHibernate");
tarefa.setFinalizado(false);
tarefa.setDataFinalizacao(null);
EntityManagermanager=//abrirumEntityManager
manager.getTransaction().begin();
manager.merge(tarefa);
manager.getTransaction().commit();
O JPA possui uma linguagem prpria de queries para facilitar a busca de objetos
chamada de JPQL. O cdigo a seguir mostra uma pesquisa que retorna todas as
tarefas no finalizadas:
EntityManagermanager=//abrirumEntityManager
List<Tarefa>lista=manager
.createQuery("selecttfromTarefaastwheret.finalizado=false")
.getResultList();
for(Tarefatarefa:lista){
System.out.println(tarefa.getDescricao());
}
EntityManagermanager=//abrirumEntityManager
Queryquery=manager
.createQuery("selecttfromTarefaast"+
"wheret.finalizado=:paramFinalizado");
query.setParameter("paramFinalizado",false);
List<Tarefa>lista=query.getResultList();
Uma confuso que pode ser feita a primeira vista pensar que o JPA com
Hibernate lento, pois, ele precisa gerar as nossas queries, ler objetos e suas
anotaes e assim por diante. Na verdade, o Hibernate faz uma srie de
otimizaes internamente que fazem com que o impacto dessas tarefas seja
prximo a nada. Portanto, o Hibernate , sim, performtico, e hoje em dia pode
ser utilizado em qualquer projeto que se trabalha com banco de dados.
packagebr.com.caelum.tarefas.jpa;
importjavax.persistence.Query;
//outrosimportsomitidos
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancod 15/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
publicclassBuscaTarefas{
publicstaticvoidmain(String[]args){
EntityManagerFactoryfactory=Persistence.
createEntityManagerFactory("tarefas");
EntityManagermanager=factory.createEntityManager();
//cuidado,useoimportjavax.persistence.Query
Queryquery=manager
.createQuery("selecttfromTarefaast"+
"wheret.finalizado=:paramFinalizado");
query.setParameter("paramFinalizado",true);
List<Tarefa>lista=query.getResultList();
for(Tarefat:lista){
System.out.println(t.getDescricao());
}
manager.close();
}
}
CAPTULO ANTERIOR:
PRXIMO CAPTULO:
E agora?
VocencontraaCaelumtambmem:
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancod 16/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
BlogCaelum
CursosOnline
Newsletter
CasadoCdigo
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancod 17/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancod 18/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancod 19/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancod 20/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancod 21/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancod 22/23
06/02/2017 UmaintroduoprticaaoJPAcomHibernateJavaparaDesenvolvimentoWeb
https://www.caelum.com.br/apostilajavaweb/umaintroducaopraticaaojpacomhibernate/#144mapeandoumaclassetarefaparanossobancod 23/23