Escolar Documentos
Profissional Documentos
Cultura Documentos
HOME
AUTHOR
MAGAZINES
LIST OF POSTS
Social Media
Home Swing Jdbc:Banco De Dados Hibernate | Jpa Utilizando Swing com JPA/Hibernate
Este tutorial poderia ser uma segunda parte do tutorial anterior Utilizando Swing com Banco de Dados, a classe de interface com usurio 99% a mesma, a classe controller idem. O que est diferente aqui que utilizaremos o framework Hibernate, para a persistncia com banco de dados, com JPA (Java Persistence API). Utilizaremos desta vez o banco de dados HSQLDB no modo standalone, mas quem preferir pode continuar utilizando o MySql como no tutorial anterior, s utilizar as mesmas configuraes de url, drive, usurio e senha, quando for necessrio utilizar. O padro MVC tambm ser seguido como no tutorial anterior, do link acima, ento caso no tenha lido o tutorial anterior, seria importante ler a respeito do que o padro MVC. 1. Arquivos necessrios Para o desenvolvimento deste tutorial sero necessrias algumas bibliotecas referentes ao Hibernate e a JPA, e mais algumas que necessitam ser utilizadas como algumas dependncias. E tambm claro do Driver JDBC do HSQLDB ou do MySql. Veja as bibliotecas necessrias na figura 1.
Popular Posts
Manipulando Arquivo Txt com Java Ler dados do teclado com a classe Scanner Chat Multi Usurios com Socket Utilizando Swing com Banco de Dados Enviando email com a API JavaMail
www.mballem.com/post/utilizando-swing-com-jpahibernate
1/23
18/09/13
Categories
Arquivos (Xml|Txt|Properties) (8) Dicas (5) Fundamentos Java (9) Hibernate | Jpa (6) Jdbc:Banco De Dados (14) Jms (Java Message Service) (1) Nosql:Banco De Dados (2) Noticias (18) Outras Apis (15) Socket (4) Figura 1 - Bibliotecas Montei um pacote com todas as bibliotecas e as disponibilizei para download aqui. 2. Java Persistence API e Hibernate JPA uma especificao padro do Java para persistncia de dados. A JPA define um meio de mapeamento objeto-relacional para objetos Java, os chamados POJOs, denominados beans de entidade. Diversos frameworks de mapeamento objeto/relacional, como o Hibernate, implementam a JPA gerenciando o desenvolvimento de entidades do Modelo Relacional usando a plataforma nativa Java SE e Java EE. O Hibernate um framework para mapeamento objetorelacional, totalmente escrito em Java. O principal objetivo do Hibernate diminuir a complexidade entre os programas escritos em Java, baseando-se no modelo orientado objeto. Quando utilizamos o HIbernate, deixamos de trabalhar com tabelas e colunas, e passamos a trabalhar com objetos. Quem j desenvolveu em Java com banco de dados e utilizando ResultSet e PreparedStatement para criar consultas e outras aes com o banco de dados, trabalhou diretamente com tabelas e colunas. Utilizando o Hibernate, as tabelas e colunas so mapeadas por mapeamentos XML ou anotaes, e a partir da trabalhamos apenas com objetos, o que facilita em muito o desenvolvimento. 3. Arquivo persistence.xml Spring Framework (4) Swing (6) Video Aula (5)
Tag Cloud
arquivos artigos banco de dados boas praticas capturar html
certificacoes chat criteria dao dom
java
Favourites Links
Apache Tomcat Forum GUJ Forum Javafree Hibernate Framework Intellij IDEA JBoss Application Server
www.mballem.com/post/utilizando-swing-com-jpahibernate
2/23
18/09/13
Quando utilizamos JPA, precisamos utilizar um arquivo que contem algumas configuraes importantes para a conexo com o banco de dados atravs do Hibernate. Este arquivo deve ser chamado de persistence.xml e estar dentro de um diretrio chamado META-INF no classpath da aplicao, ou seja, no mesmo nvel do pacote br, o primeiro pacote dos fontes, veja na figura 2.
Follow us on Twitter
Follow @m ballem 37 follow ers
Recommend us on Google
2
Find us on Facebook
Figura 2 - Projeto Listagem 1. Arquivo persistence.xml
1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8
Encontre-nos no Facebook
mballem.com
Curtir
? < ? x m lv e r s i o n = " 1 . 0 "e n c o d i n g = " U T F 8 " ? > 148 pessoas curtiram mballem.com. < p e r s i s t e n c ex m l n s = " h t t p : / / j a v a . s u n . c o m / x m l / n s / p e r s i s t e n c e
< p e r s i s t e n c e u n i tn a m e = " a g e n d a "t r a n s a c t i o n t y p e < c l a s s > b r . m b . t u t o r i a l H i b e r n a t e J p a . m o d e l . C o n t a t o < / < p r o p e r t i e s > < p r o p e r t yn a m e = " h i b e r n a t e . c o n n e c t i o n . u r l " < p r o p e r t yn a m e = " h i b e r n a t e . c o n n e c t i o n . d r i v e r _ c l a s s " < p r o p e r t yn a m e = " h i b e r n a t e . c o n n e c t i o n . u s e r n a m e " < p r o p e r t yn a m e = " h i b e r n a t e . c o n n e c t i o n . p a s s w o r d " < p r o p e r t yn a m e = " h i b e r n a t e . d i a l e c t "v a l u e < p r o p e r t yn a m e = " h i b e r n a t e . s h o w _ s q l "v a l u e < p r o p e r t yn a m e = " h i b e r n a t e . f o r m a t _ s q l "v a l u e < p r o p e r t yn a m e = " h i b e r n a t e . h b m 2 d d l . a u t o " < / p r o p e r t i e s > < / p e r s i s t e n c e u n i t > < / p e r s i s t e n c e >
A tag persistence-unit possui dois elementos importantes, o name que recebe um nome para identificar as configuraes e o transaction-type que indica se aplicao ser com ou sem container (servidor web). Precisamos tambm indicar neste arquivo onde se encontra o mapeamento, para isso, usamos a tag class e nela indicamos a classe que contm as anotaes referentes a tabela Contatos. As demais tags, filhas de properties, so referentes as configuraes do Hibernate, como as configuraes para conexo e para exibir alguns logs no console dos SQLs executados.
www.mballem.com/post/utilizando-swing-com-jpahibernate 3/23
18/09/13
4. Tabela contatos Desta vez no iremos precisar de script para criar a tabela Contatos no banco de dados, a JPA nos fornece uma maneira simples para isso. Basta a criao de um mtodo que atravs dos mapeamentos as tabelas so geradas. Para criar o banco de dados basta executar a classe principal GeraBanco , conforme a listagem 2. Listagem 2. Gerando o banco de dados.
1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 p a c k a g eb r . m b . t u t o r i a l H i b e r n a t e J p a . a g e n d a ; i m p o r to r g . h i b e r n a t e . c f g . C o n f i g u r a t i o n ; i m p o r to r g . h i b e r n a t e . e j b . E j b 3 C o n f i g u r a t i o n ; i m p o r to r g . h i b e r n a t e . t o o l . h b m 2 d d l . S c h e m a E x p o r t ; p u b l i cc l a s sG e r a B a n c o{ p u b l i cs t a t i cv o i dm a i n ( S t r i n g [ ]a r g s ){ E j b 3 C o n f i g u r a t i o nc f g=n e wE j b 3 C o n f i g u r a t i o n ( ) ; / / a g e n d ae hon o m ed op e r s i s t e n c e u n i tn op e r s i s t e n c e . x m l . c f g . c o n f i g u r e ( " a g e n d a " ,n u l l ) ; C o n f i g u r a t i o nh b m c f g=c f g . g e t H i b e r n a t e C o n f i g u r a t i o n ( ) ; S c h e m a E x p o r ts c h e m a E x p o r t=n e wS c h e m a E x p o r t ( h b m c f g ) ; s c h e m a E x p o r t . c r e a t e ( t r u e ,t r u e ) ;
?
Ao gerar o banco de dados HSQLDB, ser criada uma pasta chamada db e dentro dela estaro os arquivos do banco de dados. Esta pasta ser gerada um nvel acima do pacote dos arquivos fontes da aplicao, ou seja, no mesmo nvel em que voc deve ter o pacote lib, veja na figura 2. Quem utilizar um banco de dados no modo servidor, como o Mysql ou outros, algumas vezes ser necessrio criar o banco de dados manualmente no gerenciador, para ento rodar a classe GeraBanco , que ela ir criar as tabelas. 5. Classe de Conexo Trabalhando com JPA/Hibernate, teremos uma classe de conexo diferente do que temos quando criamos uma conexo direta por JDBC. No caso da JPA devemos criar uma classe conforme a listagem 3. Essa classe vai ler as configuraes do arquivo persistence.xml e configurar uma fabrica de conexes para o sistema. Sempre que for necessria uma conexo, faremos uma chamada ao mtodo esttico getEntityManager().
www.mballem.com/post/utilizando-swing-com-jpahibernate
4/23
18/09/13
6. Classe GenericDao Vamos criar uma classe genrica para os mtodos insert, update e delete, e algumas consultas que podem ser padro para vrias entidades, veja na listagem 4. Listagem 4. Classe GenericDao
1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 p a c k a g eb r . m b . t u t o r i a l H i b e r n a t e J p a . d a o ; i m p o r to r g . h i b e r n a t e . S e s s i o n ; i m p o r to r g . h i b e r n a t e . c r i t e r i o n . R e s t r i c t i o n s ; i m p o r tj a v a x . p e r s i s t e n c e . E n t i t y M a n a g e r ; i m p o r tj a v a x . p e r s i s t e n c e . E n t i t y T r a n s a c t i o n ; i m p o r tj a v a x . p e r s i s t e n c e . P e r s i s t e n c e C o n t e x t ; i m p o r tj a v a . i o . S e r i a l i z a b l e ; i m p o r tj a v a . l a n g . r e f l e c t . P a r a m e t e r i z e d T y p e ; i m p o r tj a v a . u t i l . L i s t ; p u b l i cc l a s sG e n e r i c D a o < Te x t e n d sS e r i a l i z a b l e >{ @ P e r s i s t e n c e C o n t e x t ( u n i t N a m e=" a g e n d a " ) p r i v a t ef i n a lE n t i t y M a n a g e re n t i t y M a n a g e r ; p r i v a t ef i n a lC l a s s < T >p e r s i s t e n t C l a s s ; p u b l i cG e n e r i c D a o ( ){ t h i s . e n t i t y M a n a g e r=E n t i t y M a n a g e r U t i l . g e t E n t i t y M a n a g e r ( ) ; t h i s . p e r s i s t e n t C l a s s=( C l a s s < T > )( ( P a r a m e t e r i z e d T y p e ) g e t C l a s s ( ) . g e t G e n e r i c S u p e r c l a s s ( ) ) . g e t A c t u a l T y p e A r g u m e n t s ( ) [ } p u b l i cE n t i t y M a n a g e rg e t E n t i t y M a n a g e r ( ){ r e t u r ne n t i t y M a n a g e r ; } p r o t e c t e dv o i ds a v e ( Te n t i t y ){ E n t i t y T r a n s a c t i o nt x=g e t E n t i t y M a n a g e r ( ) . g e t T r a n s a c t i o n ( ) ; t r y{ t x . b e g i n ( ) ; g e t E n t i t y M a n a g e r ( ) . p e r s i s t ( e n t i t y ) ; t x . c o m m i t ( ) ; }c a t c h( T h r o w a b l et ){
5/23
www.mballem.com/post/utilizando-swing-com-jpahibernate
18/09/13
3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5 8 5 9 6 0 6 1 6 2 6 3 6 4 6 5 6 6 6 7 6 8 6 9 7 0 7 1 7 2 7 3 7 4 7 5 7 6 7 7 7 8 7 9 8 0 8 1 8 2 8 3 8 4 8 5 8 6 8 7 8 8 8 9 9 0 9 1 9 2 9 3 9 4 9 5 9 6 9 7 9 8 9 9 1 0 0 1 0 1 1 0 2 1 0 3 1 0 4 1 0 5
t . p r i n t S t a c k T r a c e ( ) ; t x . r o l l b a c k ( ) ; }f i n a l l y{ c l o s e ( ) ; }
p r o t e c t e dv o i du p d a t e ( Te n t i t y ){ E n t i t y T r a n s a c t i o nt x=g e t E n t i t y M a n a g e r ( ) . g e t T r a n s a c t i o n ( ) ; t r y{ t x . b e g i n ( ) ; g e t E n t i t y M a n a g e r ( ) . m e r g e ( e n t i t y ) ; t x . c o m m i t ( ) ; }c a t c h( T h r o w a b l et ){ t . p r i n t S t a c k T r a c e ( ) ; t x . r o l l b a c k ( ) ; }f i n a l l y{ c l o s e ( ) ; } } p r o t e c t e dv o i dd e l e t e ( Te n t i t y ){ E n t i t y T r a n s a c t i o nt x=g e t E n t i t y M a n a g e r ( ) . g e t T r a n s a c t i o n ( ) ; t r y{ t x . b e g i n ( ) ; g e t E n t i t y M a n a g e r ( ) . r e m o v e ( e n t i t y ) ; t x . c o m m i t ( ) ; }c a t c h( T h r o w a b l et ){ t . p r i n t S t a c k T r a c e ( ) ; t x . r o l l b a c k ( ) ; }f i n a l l y{ c l o s e ( ) ; }
p u b l i cL i s t < T >f i n d A l l ( )t h r o w sE x c e p t i o n{ S e s s i o ns e s s i o n=( S e s s i o n )g e t E n t i t y M a n a g e r ( ) . g e t D e l e g a t e ( ) ; r e t u r ns e s s i o n . c r e a t e C r i t e r i a ( p e r s i s t e n t C l a s s ) . l i s t ( ) ; } p u b l i cTf i n d B y N a m e ( S t r i n gn o m e ){ S e s s i o ns e s s i o n=( S e s s i o n )g e t E n t i t y M a n a g e r ( ) . g e t D e l e g a t e ( ) ; r e t u r n( T )s e s s i o n . c r e a t e C r i t e r i a ( p e r s i s t e n t C l a s s ) . a d d ( R e s t r i c t i o n s . e q ( " n o m e " ,n o m e ) . i g n o r e C a s e ( ) ) . u n i q u e R e s u l t ( ) ; } p u b l i cTf i n d B y I d ( l o n gi d ){ S e s s i o ns e s s i o n=( S e s s i o n )g e t E n t i t y M a n a g e r ( ) . g e t D e l e g a t e ( ) ; r e t u r n( T )s e s s i o n . c r e a t e C r i t e r i a ( p e r s i s t e n t C l a s s ) . a d d ( R e s t r i c t i o n s . e q ( " i d " ,i d ) ) . u n i q u e R e s u l t ( ) ; } p r i v a t ev o i dc l o s e ( ){ i f( g e t E n t i t y M a n a g e r ( ) . i s O p e n ( ) ){ g e t E n t i t y M a n a g e r ( ) . c l o s e ( ) ; } s h u t d o w n ( ) ; } p r i v a t ev o i ds h u t d o w n ( ){ E n t i t y M a n a g e re m=E n t i t y M a n a g e r U t i l . g e t E n t i t y M a n a g e r ( ) ; E n t i t y T r a n s a c t i o nt x=e m . g e t T r a n s a c t i o n ( ) ; t x . b e g i n ( ) ; e m . c r e a t e N a t i v e Q u e r y ( " S H U T D O W N " ) . e x e c u t e U p d a t e ( ) ; e m . c l o s e ( ) ; }
6/23
www.mballem.com/post/utilizando-swing-com-jpahibernate
18/09/13
1 0 6
A anotao @PersistenteContex() indica qual classe ser responsvel pela persistncia dos dados. A varivel persistentClass utilizada para termos acesso a entidade que est sendo executada no momento. Utilizamos o tipo genrico na classe, e atravs do tipo genrico que obtemos a entidade para utiliz-la nas consultas, veremos mais a frente. No construtor da classe criamos um objeto EntityManager, que nos dar acesso ao mtodos necessrios, e obtemos a entidade que est utilizando a classe no momento. Nos mtodos save, update e delete, precisamos criar uma transao, abrir est transao e ento executar o que queremos fazer. No caso do mtodo save(), utilizamos o persist(), que recebe como par metro um objeto e o framework executa um insert atravs dele. A grande vantagem que no precisamos nos preocupar com o SQL de insert, update ou delete, s passamos o objeto e o framework faz o resto. Depois da execuo, se tudo ocorrer bem executado um commit na transao do banco de dados e ento um close chamado para fechar a comunicao com o banco de dados.
Back top
Uma observao para quem no est utilizando o HSQLDB, o mtodo shutdown() no deve ser utilizado, este mtodo utilizado apenas no HSQLDB. No artigo JDBC com Banco de Dados Standalone eu falo sobre isso.
Nas consultas foi utilizada a API Criteria, uma forma diferente de fazer o select quando utilizamos orientao objetos e no objetos relacionais. Outra forma que pode ser utilizada o HQL, um dialeto SQL para o Hibernate, uma consulta muito parecida com o SQL, porm se trabalha com objetos e seus atributos e no com tabelas e colunas. Quando utilizamos Criteria, precisamos indicar qual a entidade que far a consulta, por isso, utilizamos a varivel persistentClass, para passarmos para o mtodo qual entidade est sendo executada no momento da consulta. Seria como se ele estivesse passando por par metro algo como isto: Contato.class 7. Classe Contato
www.mballem.com/post/utilizando-swing-com-jpahibernate
7/23
18/09/13
Nossa classe contato ter como atributos os campos da tabela Contatos, mapeados em forma de anotaes. Atravs das anotaes podemos passar todas as informaes que uma coluna teria, como o tipo de dado, tamanho, nome, entre outros. Listagem 5. Classe Contato
1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 p a c k a g eb r . m b . t u t o r i a l H i b e r n a t e J p a . m o d e l ; i m p o r tj a v a . s q l . D a t e ; i m p o r tj a v a x . p e r s i s t e n c e . * ; i m p o r tj a v a . i o . S e r i a l i z a b l e ; @ E n t i t y @ T a b l e ( n a m e=" C O N T A T O S " ) p u b l i cc l a s sC o n t a t oi m p l e m e n t sS e r i a l i z a b l e{ p r i v a t es t a t i cf i n a ll o n gs e r i a l V e r s i o n U I D=1 L ; @ I d @ G e n e r a t e d V a l u e ( s t r a t e g y=G e n e r a t i o n T y p e . I D E N T I T Y ) @ C o l u m n ( n a m e=" I D _ C O N T A T O " ) p r i v a t eL o n gi d ; @ C o l u m n ( n a m e=" N O M E " ) p r i v a t eS t r i n gn o m e ; @ C o l u m n ( n a m e=" A P E L I D O " ) p r i v a t eS t r i n ga p e l i d o ; @ T e m p o r a l ( T e m p o r a l T y p e . D A T E ) @ C o l u m n ( n a m e=" D A T A _ N A S C I M E N T O " ) p r i v a t eD a t ed t N a s c i m e n t o ; / / g e r eo sm t o d o sg e t t e r sa n ds e t t e r s
?
8. Classe ContatoDao Criamos a classe GenericDao para ser herdadas pelos demais daos, assim, vamos agora criar a classe ContatoDao , onde estaro os mtodos mais especficos da classe. Veja na listagem 6. Listagem 6. Classe ContatoDao
1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 p a c k a g eb r . m b . t u t o r i a l H i b e r n a t e J p a . d a o ; i m p o r tb r . m b . t u t o r i a l H i b e r n a t e J p a . m o d e l . C o n t a t o ; p u b l i cc l a s sC o n t a t o D a oe x t e n d sG e n e r i c D a o < C o n t a t o >{ p u b l i cv o i ds a l v a r ( C o n t a t oc o n t a t o ){ s a v e ( c o n t a t o ) ; } p u b l i cv o i da l t e r a r ( C o n t a t oc o n t a t o ){ u p d a t e ( c o n t a t o ) ; } p u b l i cv o i de x c l u i r ( l o n gi d ){ C o n t a t oc=f i n d B y I d ( i d ) ; d e l e t e ( c ) ; }
8/23
www.mballem.com/post/utilizando-swing-com-jpahibernate
18/09/13
2 0
Veja que utilizamos herana nesta classe, herdando os mtodos criados na classe GenericDao . Nossos mtodos salvar(), alterar() e excluir() no possuem mais a criao do SQL que ser executado no banco de dados, como no artigo anterior, e sim uma chamada ao mtodo da classe GenericDao e l os mtodos do EntityManager faro o trabalho. 9. Classe ContatoController Pouqussimas alteraes sero feitas na classe controller em relao a classe controller do artigo anterior. Apenas foram alterados o nome do pacote do projeto, as excees que antes eram SQLException para Exception e no mtodo listaContatos() o retorno foi alterado de dao.findContatos() para dao.findAll(), j que agora temos um mtodo genrico e no exclusivo para contatos. Essa uma das vantagens do padro MVC, ns podemos modificar parte do projeto sem que influencie drasticamente em outros pontos dele. Listagem 7. Classe ContatoController
1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 p a c k a g eb r . m b . t u t o r i a l H i b e r n a t e J p a . c o n t r o l l e r ; i m p o r tb r . m b . t u t o r i a l H i b e r n a t e J p a . d a o . C o n t a t o D a o ; i m p o r tb r . m b . t u t o r i a l H i b e r n a t e J p a . m o d e l . C o n t a t o ; i m p o r tj a v a x . s w i n g . * ; i m p o r tj a v a . s q l . D a t e ; i m p o r tj a v a . t e x t . D a t e F o r m a t ; i m p o r tj a v a . t e x t . P a r s e E x c e p t i o n ; i m p o r tj a v a . t e x t . S i m p l e D a t e F o r m a t ; i m p o r tj a v a . u t i l . L i s t ; p u b l i cc l a s sC o n t a t o C o n t r o l l e r{ p r i v a t eD a t ef o r m a t a r D a t a ( S t r i n gd a t a )t h r o w sP a r s e E x c e p t i o n{ D a t e F o r m a tf o r m a t t e r=n e wS i m p l e D a t e F o r m a t ( r e t u r nn e wD a t e (f o r m a t t e r . p a r s e ( d a t a ) . g e t T i m e ( )) ; } p u b l i cv o i ds a l v a r ( S t r i n gn o m e ,S t r i n ga p e l i d o ,S t r i n gd t N a s c i m e n t o ) C o n t a t oc o n t a t o=n e wC o n t a t o ( ) ; c o n t a t o . s e t N o m e ( n o m e ) ; c o n t a t o . s e t A p e l i d o ( a p e l i d o ) ; c o n t a t o . s e t D t N a s c i m e n t o ( f o r m a t a r D a t a ( d t N a s c i m e n t o ) ) ; } n e wC o n t a t o D a o ( ) . s a l v a r ( c o n t a t o ) ;
?
p u b l i cv o i da l t e r a r ( l o n gi d ,S t r i n gn o m e ,S t r i n ga p e l i d o ,S t r i n gd t N a s c i m e n t o ) C o n t a t oc o n t a t o=n e wC o n t a t o ( ) ; c o n t a t o . s e t I d ( i d ) ; c o n t a t o . s e t N o m e ( n o m e ) ; c o n t a t o . s e t A p e l i d o ( a p e l i d o ) ;
9/23
www.mballem.com/post/utilizando-swing-com-jpahibernate
18/09/13
3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5 2 5 3 5 4 5 5 5 6 5 7
c o n t a t o . s e t D t N a s c i m e n t o ( f o r m a t a r D a t a ( d t N a s c i m e n t o ) ) ; } n e wC o n t a t o D a o ( ) . a l t e r a r ( c o n t a t o ) ;
Figura 3 - Interface Contatos A classe ContatoFrame sofreu alteraes mnimas, que foram apenas, alterar as excees SQLException por excees do tipo Exception. Faa essa alterao e nos casos dos mtodos que tenham dois tipos de excees, deixe a Exception no ltimo catch{}. Essa classe no foi postada no artigo, mas voc pode peg-la no tutorial anterior, acessando Utilizando Swing com Banco de Dados, e claro, no se esquea de alterar o nome do pacote e dos imports de ContatoController e Contato . Concluso
www.mballem.com/post/utilizando-swing-com-jpahibernate
10/23
18/09/13
Este tutorial demonstrou como configurar e criar um projeto utilizando JPA com Hibernate. Fazendo uma comparao com o tutorial Utilizando Swing com Banco de Dados , onde utilizamos conexo direta com JDBC e utilizvamos PreparedStatement e ResultSet, e os SQLs para consultas e demais mtodos com banco de dados, o framework Hibernate nos facilita muito nesse ponto. Tambm podemos comparar como vlido separar as camadas da aplicao utilizando o padro MVC, assim, facilita muito a manuteno dos cdigos. Saiba mais Criteria http://download.oracle.com/javaee/6/tutorial/doc/gjitv.html Genricos em Java http://en.wikipedia.org/wiki/Generics_in_Java HQL http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html Criteria com hibernate http://docs.jboss.org/hibernate/core/3.3/reference/en/html/querycriteria.html JPA http://www.oracle.com/technetwork/articles/javaee/jpa137156.html Hibernate Annotations http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html Graphical User Interface http://download.oracle.com/javase/tutorial/ui/index.html
Tags: swing
Short Link:
http://bit.ly/16hnKzv
Gosto
Tw eet
Share
Related Posts
Injeo de
www.mballem.com/post/utilizando-swing-com-jpahibernate
Spring 3 MVC
11/23
18/09/13
Share
Exatamente, Mrcio! Realmente eu estava utilizando o mesmo DAO para inserir e depois fazer uma consulta com findBy(). Eu pensava em reutilizar o DAO para economizar objetos na memria e por comodidade (rs). Na sua opinio vale a pena reutilizar o DAO para vrias operaes ou sempre usar um para cada ? Existe alguma vantagem em cada uma dessas abordagens ? Desculpe a demora para responder. Att.,
James
Reply MB allem
Share
4 months ago
James Daniel
Ol James. No existe diferena em relao a performance. Seria mais relacionado individualmente ao padro de seus projetos. Escolha uma forma de usar e siga em frente.
Reply
Share
4 months ago
Obrigado pela pronta resposta, Mrcio. Estou longe do meu computador agora, mas assim que chegar vou testar o que voc me passou. www.mballem.com/post/utilizando-swing-com-jpahibernate
12/23
18/09/13
testar o que voc me passou. Eu tinha feito uma classe para testar uma insero seguida de uma consulta (findById) usando o mesmo DAO. Assim que estiver perto do meu micro testo e retorno. Obrigado,
MB allem
James
Reply
Share
4 months ago
Ol James! O commit() no fecha a sesso. O que pode estar acontecendo que depois de salvar o objeto, voc est tentando de alguma maneira usando o mesmo objeto EntityManager e acontece o erro dizendo que o EntityManager j est fechado. Depois de salvar, voc precisa criar uma nova instancia do Dao para que ele crie um novo objeto EntityManager e assim, acredito que no ser lanada a exceo. Estou levando em considerao o exemplo do meu cdigo. Quando voc cria uma instancia do Dao criado um EntityManager e depois de salvar um objeto esse EntityManager fechado. Ento, nessa instancia do Dao voc no ter mais acesso ao EntityManager porque ele foi fechado. Dai precisa criar uma nova instancia do Dao para usar o EntityManager novamente. Voc pode mudar isso, tentando fazer essa alterao no cdigo: [sourcecode language="java"] public GenericDao() { //remova o entitymanager do construtor e passe ele para o mtodo getEntityManager(). //this.entityManager = EntityManagerUtil.getEntityManager(); this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments() [0]; } public EntityManager getEntityManager() { return EntityManagerUtil.getEntityManager(); } www.mballem.com/post/utilizando-swing-com-jpahibernate
13/23
18/09/13
} [/sourcecode]
Reply
Share
4 months ago
James Daniel
Marcio, consegui resolver fazendo isto comentando no mtodo close() no cdigo do GenericDao: protected void save(T entity) { EntityTransaction tx = getEntityManager().getTransaction(); try { tx.begin(); getEntityManager().persist(entity); getEntityManager().flush(); tx.commit(); } catch (Throwable t) { t.printStackTrace(); tx.rollback(); } //finally { //close(); //} } Suspeito que o close() est sendo feito aps o commit() automaticamente. Pode ser por isso que ele acusava o erro aps eu tentar fechar manualmente. Att.,
James
Reply
Share
4 months ago
James Daniel
Fala Marcio! Antes de mais nada, parabns pelo excelente tutorial! Eu tentei inserir aqui com MySQL usando uma tabela chamada Usuario [ id, login, senha] Ele grava no banco mas sempre d o erro "EntityManager is Closed" conforme abaixo: Hibernate: insert into db_piloto.usuario (login, senha, id_usuario) values (?, ?, ?) Exception in thread "main" java.lang.IllegalStateException: EntityManager is closed at org.hibernate.ejb.EntityManagerImpl.getSession(EntityManagerImpl.java:89)
www.mballem.com/post/utilizando-swing-com-jpahibernate
14/23
18/09/13
org.hibernate.ejb.EntityManagerImpl.getSession(EntityManagerImpl.java:89) at org.hibernate.ejb.AbstractEntityManagerImpl.getDelegate(AbstractEntityManagerImpl.java:1096) at br.com.coldsoft.projetos.piloto.dao.GenericDao.findById(GenericDao.java:87) at br.com.coldsoft.projetos.piloto.dao.UsuarioDaoT.main(UsuarioDaoT.java:18) J viu isso antes? Tem alguma dica para esse erro no ocorrer mais ? Muito Obrigado,
V era
James
Reply
Share
4 months ago
This post is truly a nice one it helps new net visitors, who are wishing in favor of blogging.
Reply MB allem Share
> Vera
Reply
4 months ago
MB allem
9 months ago
Hs
Ol Hs. Faa o download do projeto no link que disponibilizei pelo github no final do tutorial e importe as bibliotecas necessrias atravs do maven.
Reply Share
9 months ago
Share
Rodrigo
11 months ago
Ok obrigado pela ajuda, tenho certeza que ajudou muitos iniciantes, grande abrao
Reply
Share
MB allem
11 months ago
www.mballem.com/post/utilizando-swing-com-jpahibernate
No Rodrigo, no deixara mais lento. O log serve para voc ter certas informaes do funcionamento do seu sistema, principalmente para te informar erros ocasionados no processamento do seu aplicativo.
15/23
18/09/13
Share
Rodrigo
11 months ago
Share
MB allem
11 months ago
oi Rodrigo, isso no erro, aviso. Ele pede que voc utilize um arquivo de configurao para log. Isso no obrigatrio, mas caso queira incluir, de uma lida aqui> http://logging.apache.org/log4...
Reply
Share
Rodrigo
11 months ago
Corrigi o problema de salvar dados, parece esta tudo funcionando. Mas ainda persisti o erro que citei acima
Reply
Share
Rodrigo
11 months ago
Obrigado mesmo cara, desculpa at ta ai encomodando demais.., Tipo funcionou, crio a tabela mas ainda surge o erro >> log4j:WARN No appenders could be found for logger (org.hibernate.type.BasicTypeRegistry). log4j:WARN Please initialize the log4j system properly. Pede pra min inicializar o sistema log4j corretamente.., no entendi porque, e tambm no est salvando dados na tabela
Boa noite
Reply
Share
MB allem
11 months ago
Share
Rodrigo
11 months ago
Eu li sobre o erro, baixei as api's que dizia que resolvia o problema mas mesmo assim persisti o erro. No tem como voce me disponibilizar os jar's que voce usou no seu projeto? Agradeo desde j, abrao
www.mballem.com/post/utilizando-swing-com-jpahibernate 16/23
18/09/13
Share
MB allem
11 months ago
Rodrigo, parece que o problema agora ficou mais visvel, acredito que seja problema com a biblioteca slf4j, conforme informa a exceo: org.slf4j.impl.StaticLoggerBinder. Segundo relatado no link http://www.slf4j.org/codes.htm..., voc pode entender mais sobre esse erro.
Reply
Share
Rodrigo
11 months ago
www.mballem.com/post/utilizando-swing-com-jpahibernate
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". SLF4J: Defaulting to no-operation (NOP) logger implementation SLF4J: See http://www.slf4j.org/codes.htm... for further details. log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version). log4j:WARN Please initialize the log4j system properly. Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: org.hibernate.cfg.AnnotationConfiguration.addProperties(Ljava/util/Properties;)Lorg/hibernate/cfg/Ann at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:756) at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:191) at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:253) at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:125) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:78) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) at jpaTesteSwing.Dao.EntityManagerUtil.getEntityManager(EntityManagerUtil.java:12) at jpaTesteSwing.Dao.GenericDao. (GenericDao.java:21) at jpaTesteSwing.Dao.ProdutoDao. (ProdutoDao.java:8) at
17/23
18/09/13
Share
Rodrigo
11 months ago
Share
Rodrigo
11 months ago
> Rodrigo
11 months ago
MB allem
No final do artigo, tem um link para o PDF do artigo e outro link para repositrio github, onde voc pode fazer o download.
Reply Share
11 months ago
Rodrigo, esse tipo de erro acontece quando tem incompatibilidade entre as verses das bibliotecas. Voc baixou as bibliotecas ou est usando as listadas no arquivo pom.xml que disponibilizei no projeto para download?
Reply
Share
Rodrigo
11 months ago
Boa noite, depois de eu adicionar todas as anotaes e bibliotecas necessrias estora o seguinte erro>>
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.annotations.Version). log4j:WARN Please initialize the log4j system properly. Exception in thread "AWT-EventQueue-0" java.lang.NoSuchMethodError: org.hibernate.cfg.AnnotationConfiguration.addProperties(Ljava/util/Properties;)Lorg/hibernate/cfg/Ann at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:756) at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:191) at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java:253)
www.mballem.com/post/utilizando-swing-com-jpahibernate 18/23
18/09/13
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:125) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:78) at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) at jpaTesteSwing.Dao.EntityManagerUtil.getEntityManager(EntityManagerUtil.java:12) at jpaTesteSwing.Dao.GenericDao. (GenericDao.java:21) at jpaTesteSwing.Dao.ProdutoDao. (ProdutoDao.java:8) at jpaTesteSwing.Controller.ProdutoController.salvar(ProdutoController.java:12) at jpaTesteSwing.View.FrameCadastro.onClickSalvar(FrameCadastro.java:51) at jpaTesteSwing.View.FrameCadastro$1.actionPerformed(FrameCadastro.java:41) ... Seu site timo, turtorial excelente que me ajudou muito,, agradeo de puder me ajudar. Abrao
Reply
Share
MB allem
11 months ago
Share
Rodrigo
11 months ago
Share
Rodrigo
11 months ago
Ola, ta estorando um erro aqui, acho que tem a ver com a mesma anotao que voce disse que esta faltando, o erro >> Caused by: java.lang.ClassNotFoundException: org.hibernate.cfg.AnnotationConfiguration o erro estora na linha>> emf = Persistence.createEntityManagerFactory("testejpa");
Reply Share
19/23
18/09/13
MB allem
11 months ago
Ol Rodrigo, parece que tem alguma anotao faltando no cdigo. Mas voc pode gerar o banco de dados sem usar essa classe GeraBanco. Atravs da configurao "hibernate.hbm2ddl.auto" o Hibernate capaz de gerar as tabelas na momento que voc tentar executar algum mtodo de persistncia.
Reply
Share
Rodrigo
11 months ago
Ae amigo, seguinte aqui no meu cdigo esta dando um erro no metodo cfg.getHibernateConfiguration() , esse o erro que diz >> "'The method getHibernateConfiguration() from the type Ejb3Configuration refers to the missing type AnnotationConfiguration'"
Share
MB allem
a year ago
Hello Argyria! In actually I didn't have any problem with hackers. But, in the wordpress platform, you can do backup of your posts and comments in the panel control: tools/export.
Reply
Share
A rgy ria
a year ago
Hi there! I just wanted to ask if you ever have any problems with hackers? My last blog (wordpress) was hacked and I ended up losing several weeks of hard work due to no back up.
Share
MB allem
a year ago
Ok Alisson. Por acaso voc tentou ao invs de trocar a verso do banco, trocar apenas a verso do driver-jdbc?
Reply A lis s on Share
> MBallem
a year ago
Ento, eu ia fazer isto, mas como percebi que a verso do banco estava diferente, resolvi atualizar antes j que o "padro" do nosso sistema.... www.mballem.com/post/utilizando-swing-com-jpahibernate
20/23
18/09/13
MB allem
sistema.... Acho que a soluo de trocar o driver tambm iria funcionar no caso de continuar com a verso 8.1 do banco... (ou ainda arrumar as hqls).
Reply Share
a year ago
Ol Alisson, com HQL no porque no usamos HQL no exemplo e sim Criteria. Talvez possa ser a verso do banco, mas acho no tenho certeza. Qual banco voc est usando? O HSQLDB mesmo? Se for o HSQLDB, eu usei a verso 1.8.0 -> http://sourceforge.net/project... Esse problema ocorre em todo o acesso ao banco ou em uma ao especifica como salvar, alterar ou alguma consulta?
Reply A lis s on Share
> MBallem
a year ago
A lis s on
Me desculpe o engano... o que eu tentei realmente dizer que tive este problema, mas consegui resolver. Nosso sistema utilizava banco postgresql 8.4 e o cliente instalou 8.1 ento gerou esse erro,dai atualizamos e funcionou...
Reply Share
a year ago
Eu tive o mesmo seguinte problema: could not execute native bulk manipulation query. pode ser problemas com sua HQL ou a verso do banco instalada... http://coisasdetecnologia.com....
Reply
Share
a year ago
E liz a Helena
Share
MB allem
a year ago
Ol Eliza Helena! Acredito que no seja possvel salvar como voc est querendo. O que voc poderia fazer salvar em campos varchar ao invs de date/datetime/timestamp.
www.mballem.com/post/utilizando-swing-com-jpahibernate 21/23
18/09/13
Aqui nesse link: http://dev.mysql.com/doc/refma... tem os tipos de datas que o MySQL salva, olhe bem no final da pgina. Veja que os formatos so apenas aqueles, no possvel modificar ao salvar. Se optar por usar varchar, voc pode ter dois campos na tabela, uma para a data dd/mm e outro para a hora hh:mm.
Reply
Share
a year ago
E liz a Helena
Continuei pesquisando e vi que essa funo no serve para salva data e hora no banco e sim apenas para apresentar. Mas teria alguma forma de eu salvar as datas e horas em outro formato que no o padro do MYSQL DATETIME?
Reply
Share
a year ago
E liz a Helena
Gostaria primeiramente de parabeniz-lo pelo site. Para pessoas iniciantes em programao, assim como eu, suas explicaes so de grande valia e aproveitamento. Estou com problemas e gostaria de saber se voc poderia me ajudar. O meu programa tem dois atributos (startTime e endTime) do tipo DateTime no mysql e do tipo Date no java. No entanto o formato padro para salvar datas/horas no mysql yyyy/MM/dd hh:mm:ss. Para o
Pages
Home Author Magazines List of Posts
Popular Posts
Manipulando Arquivo Txt com Java Ler dados do teclado com a classe Scanner Chat Multi Usurios com Socket Utilizando Swing com Banco de Dados Enviando email com a API JavaMail
Email Subscription
Your email Address...
www.mballem.com/post/utilizando-swing-com-jpahibernate
22/23
18/09/13
Copyright 2011-2013 - MBallem | Programando com Java - Theme by MyThemeShop, edited by mballem.com Back to Top
www.mballem.com/post/utilizando-swing-com-jpahibernate
23/23