utilizando swing com jpa_hibernate

23
18/09/13 Utilizando Swing com JPA/Hibernate www.mballem.com/post/utilizando-swing-com-jpahibernate 1/23 HOME AUTHOR MAGAZINES LIST OF POSTS Home » Swing » Jdbc:Banco De Dados » Hibernate | Jpa » Utilizando Swing com JPA/Hibernate Utilizando Swing com JPA/Hibernate Published by Ballem | Fev 23 , 2011 | Swing | Jdbc:Banco De Dados | Hibernate | Jpa Este tutorial poderia ser uma segunda parte do tutorial anterior Utilizando Swing com Banco de Dados, a classe de interface com usuário é 99% a mesma, a classe controller idem. O que está diferente aqui é que utilizaremos o framework Hibernate, para a persistência 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 configurações de url, drive, usuário e senha, quando for necessário utilizar. O padrão MVC também será seguido como no tutorial anterior, do link acima, então caso não tenha lido o tutorial anterior, seria importante ler a respeito do que é o padrão MVC. 1. Arquivos necessários Para o desenvolvimento deste tutorial serão necessárias algumas bibliotecas referentes ao Hibernate e a JPA, e mais algumas que necessitam ser utilizadas como algumas dependências. E também é claro do Driver JDBC do HSQLDB ou do MySql. Veja as bibliotecas necessárias na figura 1. Search this Site... Social Media Popular Posts Manipulando Arquivo Txt com Java Ler dados do teclado com a classe Scanner Chat Multi Usuários com Socket Utilizando Swing com Banco de Dados Enviando email com a API JavaMail

Upload: orangota

Post on 26-Nov-2015

39 views

Category:

Documents


1 download

TRANSCRIPT

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 1/23

    HOME AUTHOR MAGAZINES LIST OF POSTS

    Home Swing Jdbc:Banco De Dados Hibernate |

    Jpa Utilizando Swing com JPA/Hibernate

    Utilizando Swing com JPA/HibernatePublished by Ballem | Fev 23 , 2011 | Swing | Jdbc:Banco De Dados

    | Hibernate | Jpa

    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.

    Search this Site...

    Social Media

    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

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 2/23

    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 objeto-

    relacional, 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

    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)

    Spring Framework (4)

    Swing (6)

    Video Aula (5)

    Tag Cloud

    arquivos artigos banco de

    dados boas praticas capturar html

    certificacoes chat criteria dao

    dom easy java magazine

    fundamentos java herana

    hibernate hsqldb html java

    java magazine javamail jboss

    jdbc jdk leitura e escrita de

    arquivos livros mongodb mvc

    mysql nosql noticias ocaj 7

    ocpjp 7 preparedstatement

    resultset revistas scanner

    sessionfactory socket spring

    framework spring mvc swing video

    aula xml

    Favourites Links

    Apache Tomcat

    Forum GUJ

    Forum Javafree

    Hibernate Framework

    Intellij IDEA

    JBoss Application Server

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 3/23

    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.

    Figura 2 - Projeto

    Listagem 1. Arquivo persistence.xml

    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.

    MongoDB

    MySQL

    OpenShift - Red Hat

    Oracle

    Spring Framework

    Follow us on Twitter

    Follow @mballem 37 follow ers

    Recommend us on Google

    2

    Find us on Facebook

    Encontre-nos no Facebook

    mballem.com

    Curtir

    148 pessoas curtiram mballem.com.123456789101112131415161718

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 4/23

    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.

    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().

    12345678910111213141516171819

    package br.mb.tutorialHibernateJpa.agenda; import org.hibernate.cfg.Configuration;import org.hibernate.ejb.Ejb3Configuration;import org.hibernate.tool.hbm2ddl.SchemaExport; public class GeraBanco { public static void main(String[] args) { Ejb3Configuration cfg = new Ejb3Configuration(); //agenda eh o nome do persistence-unit no persistence.xml. cfg.configure("agenda", null); Configuration hbmcfg = cfg.getHibernateConfiguration(); SchemaExport schemaExport = new SchemaExport(hbmcfg); schemaExport.create(true, true); }}

    ?

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 5/23

    Listagem 3. Classe EntityManagerUtil

    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

    12345678910111213141516

    package br.mb.tutorialHibernateJpa.dao; import javax.persistence.EntityManager;import javax.persistence.EntityManagerFactory;import javax.persistence.Persistence; public class EntityManagerUtil { private static EntityManagerFactory emf; public static EntityManager getEntityManager() { if (emf == null){ emf = Persistence.createEntityManagerFactory( } return emf.createEntityManager(); }}

    123456789101112131415161718192021222324252627282930313233343536

    package br.mb.tutorialHibernateJpa.dao; import org.hibernate.Session;import org.hibernate.criterion.Restrictions; import javax.persistence.EntityManager;import javax.persistence.EntityTransaction;import javax.persistence.PersistenceContext;import java.io.Serializable;import java.lang.reflect.ParameterizedType;import java.util.List; public class GenericDao { @PersistenceContext(unitName = "agenda") private final EntityManager entityManager; private final Class persistentClass; public GenericDao() { this.entityManager = EntityManagerUtil.getEntityManager(); this.persistentClass = (Class) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[ } public EntityManager getEntityManager() { return entityManager; } protected void save(T entity) { EntityTransaction tx = getEntityManager().getTransaction(); try { tx.begin(); getEntityManager().persist(entity); tx.commit(); } catch (Throwable t) {

    ?

    ?

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 6/23

    373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105

    t.printStackTrace(); tx.rollback(); } finally { close(); } } protected void update(T entity) { EntityTransaction tx = getEntityManager().getTransaction(); try { tx.begin(); getEntityManager().merge(entity); tx.commit(); } catch (Throwable t) { t.printStackTrace(); tx.rollback(); } finally { close(); } } protected void delete(T entity) { EntityTransaction tx = getEntityManager().getTransaction(); try { tx.begin(); getEntityManager().remove(entity); tx.commit(); } catch (Throwable t) { t.printStackTrace(); tx.rollback(); } finally { close(); } } public List findAll() throws Exception { Session session = (Session) getEntityManager().getDelegate(); return session.createCriteria(persistentClass).list(); } public T findByName(String nome) { Session session = (Session) getEntityManager().getDelegate(); return (T) session.createCriteria(persistentClass) .add(Restrictions.eq("nome", nome).ignoreCase()).uniqueResult(); } public T findById(long id) { Session session = (Session) getEntityManager().getDelegate(); return (T) session.createCriteria(persistentClass) .add(Restrictions.eq("id", id)).uniqueResult(); } private void close() { if (getEntityManager().isOpen()) { getEntityManager().close(); } shutdown(); } private void shutdown() { EntityManager em = EntityManagerUtil.getEntityManager(); EntityTransaction tx = em.getTransaction(); tx.begin(); em.createNativeQuery("SHUTDOWN").executeUpdate(); em.close(); }

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 7/23

    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.

    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

    106 }

    Back top

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 8/23

    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

    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

    123456789101112131415161718192021222324

    package br.mb.tutorialHibernateJpa.model; import java.sql.Date;import javax.persistence.*;import java.io.Serializable; @Entity@Table(name = "CONTATOS")public class Contato implements Serializable { private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "ID_CONTATO") private Long id; @Column(name = "NOME") private String nome; @Column(name = "APELIDO") private String apelido; @Temporal(TemporalType.DATE) @Column(name = "DATA_NASCIMENTO") private Date dtNascimento; //gere os mtodos getters and setters}

    12345678910111213141516171819

    package br.mb.tutorialHibernateJpa.dao; import br.mb.tutorialHibernateJpa.model.Contato; public class ContatoDao extends GenericDao { public void salvar(Contato contato) { save(contato); } public void alterar(Contato contato) { update(contato); } public void excluir(long id) { Contato c = findById(id); delete(c); }

    ?

    ?

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 9/23

    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

    20 }

    123456789101112131415161718192021222324252627282930313233

    package br.mb.tutorialHibernateJpa.controller; import br.mb.tutorialHibernateJpa.dao.ContatoDao;import br.mb.tutorialHibernateJpa.model.Contato; import javax.swing.*;import java.sql.Date;import java.text.DateFormat;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.List; public class ContatoController { private Date formatarData(String data) throws ParseException { DateFormat formatter = new SimpleDateFormat( return new Date( formatter.parse(data).getTime() ); } public void salvar(String nome, String apelido, String dtNascimento) Contato contato = new Contato(); contato.setNome(nome); contato.setApelido(apelido); contato.setDtNascimento(formatarData(dtNascimento)); new ContatoDao().salvar(contato); } public void alterar(long id, String nome, String apelido, String dtNascimento) Contato contato = new Contato(); contato.setId(id); contato.setNome(nome); contato.setApelido(apelido);

    ?

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 10/23

    9. Classe ContatoFrame

    A interface continua a mesma, uma interface como a da figura 3.

    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

    343536373839404142434445464748495051525354555657

    contato.setDtNascimento(formatarData(dtNascimento)); new ContatoDao().alterar(contato); } public List listaContatos() { ContatoDao dao = new ContatoDao(); try { return dao.findAll(); } catch (SQLException e) { JOptionPane.showMessageDialog(null, "Problemas ao localizar contaton" } return null; } public void excluir(long id) throws Exception { new ContatoDao().excluir(id); } public Contato buscaContatoPorNome(String nome) ContatoDao dao = new ContatoDao(); return dao.findByName(nome); }}

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 11/23

    0ShareTweet 0 1

    Injeo de Spring 3 MVC

    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/jpa-

    137156.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: entitymanager | hibernate | hsqldb | java | jdbc | jpa |

    swing

    Short Link: http://bit.ly/16hnKzv

    Related Posts

    Gosto 0

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 12/23

    Dependncias

    com Guice (DI)

    com Validator

    e Converter

    JTable com

    Banco de

    Dados

    Utilizando

    Swing com

    Hibernate

    (SessionFactory)

    64 comments

    Leave a message...

    Newest Share

    Reply

    James Daniel 4 months ago

    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

    MBallem 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.

    James Daniel 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.

    0

    Share

    Share

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 13/23

    Reply

    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,

    James

    MBallem 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)

    ((ParameterizedType)

    getClass().getGenericSuperclass()).getActualTypeArguments()

    [0];

    }

    public EntityManager getEntityManager() {

    return EntityManagerUtil.getEntityManager();

    }

    Share

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 14/23

    Reply

    }

    [/sourcecode]

    Reply

    James Daniel 4 months ago

    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

    James Daniel 4 months ago

    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)

    Share

    Share

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 15/23

    Reply

    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,

    James

    Reply

    Vera 4 months ago

    This post is truly a nice one it helps new net visitors,

    who are

    wishing in favor of blogging.

    Reply

    MBallem 4 months ago Vera

    Thank you Vera!

    Reply

    MBallem 9 months ago

    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

    Hs 9 months ago

    Ol, poderia disponibilizar novamente o pacote com

    as bibliotecas?

    Agradeo.

    Reply

    Rodrigo 11 months ago

    Ok obrigado pela ajuda, tenho certeza que ajudou

    muitos iniciantes, grande abrao

    MBallem 11 months ago

    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.

    Share

    Share

    Share

    Share

    Share

    Share

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 16/23

    Reply

    ocasionados no processamento do seu aplicativo.

    Reply

    Rodrigo 11 months ago

    Mas caso eu no coloque, pode deixar o sistema mais

    lento?

    Reply

    MBallem 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

    Rodrigo 11 months ago

    Corrigi o problema de salvar dados, parece esta tudo

    funcionando. Mas ainda persisti o erro que citei acima

    Reply

    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

    MBallem 11 months ago

    Rodrigo, coloquei nesse servidor de arquivos:

    http://www.4shared.com/folder/...

    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

    Share

    Share

    Share

    Share

    Share

    Share

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 17/23

    Reply

    Agradeo desde j, abrao

    Reply

    MBallem 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.

    Rodrigo 11 months ago

    Baixei todas as verses que esto no pom.xml e

    persisti o erro >>

    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/AnnotationConfiguration;

    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

    Share

    Share

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 18/23

    Reply

    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)

    Reply

    Rodrigo 11 months ago

    Ah no tinha visto kk, vlw

    Reply

    Rodrigo 11 months ago

    Sim entendo, mas onde voce disponibilizou para

    download?

    Reply

    MBallem 11 months ago Rodrigo

    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

    MBallem 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?

    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/AnnotationConfiguration;

    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)

    Share

    Share

    Share

    Share

    Share

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 19/23

    Reply

    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

    MBallem 11 months ago

    Ok Rodrigo, legal que resolveu.

    Reply

    Rodrigo 11 months ago

    ae, esquece ja resolvi esse problema..

    Reply

    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");

    MBallem 11 months ago

    Share

    Share

    Share

    Share

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 20/23

    Reply

    MBallem 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

    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'"

    pode me ajudar? Obrigado.

    Reply

    MBallem 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

    Argyria 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.

    Do you have any methods to protect against hackers?

    Reply

    MBallem a year ago

    Ok Alisson.

    Por acaso voc tentou ao invs de trocar a verso do

    banco, trocar apenas a verso do driver-jdbc?

    Alisson a year ago MBallem

    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....

    Share

    Share

    Share

    Share

    Share

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 21/23

    Reply

    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

    MBallem 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

    Alisson a year ago MBallem

    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

    Alisson 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

    Eliza Helena a year ago

    Ok. Obrigada pela dica.

    MBallem 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.

    Share

    Share

    Share

    Share

    Share

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 22/23

    Reply

    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

    Eliza Helena a year ago

    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?

    Eliza Helena a year ago

    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

    Share

    Share

    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

    Your email Address...

    Subscribe

    Email Subscription

    Inscreva-se

    para receber

    por e-mail um alerta sobre

    novas postagens.

    Junte-se a 68 outros

    seguidores.

  • 18/09/13 Utilizando Swing com JPA/Hibernate

    www.mballem.com/post/utilizando-swing-com-jpahibernate 23/23

    Copyright 2011-2013 - MBallem | Programando com Java - Theme by MyThemeShop, edited by

    mballem.com

    Back to Top