Utilizando Swing com JPA/Hibernate

Este post foi removido e transferido para a seguinte url:

http://www.mballem.com/post/utilizando-swing-com-jpahibernate

Anúncios

, , , , , ,

  1. #1 por Luxu em 20/03/2011 - 22:23

    Amigo Marcio, estou usando o SessionFactory ao invés do EntityManager para desenvolver minha primeira aplicação WEB com JSF2.0 notei q o objeto AnnotationConfiguration do hibernate está deprecated, pergunto seria melhor trocar? Qual dos dois vc me indicaria?

  2. #2 por MBallem em 21/03/2011 - 0:06

    Realmente nas últimas versões do Hibernate essa classe passou a estar depreciada por que agora o padrão passou a ser org.hibernate.cfg.Configuration tanto para mapeamentos por anotações como para mapeamentos por hbm.xml.
    Assim torna padrão o desenvolvimento e não é necessária a mudança na SessionFactory caso o projeto passe de hbm para anotações ou vice-versa.

    Se você olhar o tutorial Utilizando Swing com Hibernate (SessionFactory) verá que utilizei anotações e a classe Configuration.

  3. #3 por Adalto em 25/05/2011 - 17:40

    Oi Marcelo,

    Simplesmente excelente seu blog, muito obrigado!

    Seu material é muito rico e bem explicativo, foi de grande ajuda pra min.
    Só um pedido =], como sou meio iniciante agumas coisas que vi no seu tutorial não conhecia e somente nesse trecho de código ficou uma dúvida

    09 public class Contato implements Serializable {
    10 private static final long serialVersionUID = 1L;

    Isso porque não compreendo bem ao certo ainda o porque da implementação Serializable, mas nada que uma pesquisada não tenha solucionado, mas fica o pedido caso sobre um tempo ai um artigo explicando isso seria legal ou então sua explicação aqui mesmo já seria bem vinda.

    Obrigado novamente e continue com esse trabalho!

  4. #4 por MBallem em 25/05/2011 - 18:49

    Adalto, é aconselhavel utilizar a implementação java.io.Serializable sempre que trabalhamos com dados de I/O. No caso vamos utilizar I/O na comunicação entre a aplicação java e o banco de dados através do Hibernate.
    Essa interface garante que um objeto que saiu de um ponto chegue exatamente ao destino como ele era quando saiu.
    No caso da linha 10, a variável serialVersionUID seria o identificador dessa serialização.

    Da uma lida nesse artigo: entendendo-o-serialversionuid é muito bom.
    Obrigado pela participação.
    Att. Marcio

  5. #5 por Adalto em 26/05/2011 - 8:47

    Ops.. desculpa aeh eh Marcio! Sorry!

  6. #6 por Adalto em 26/05/2011 - 8:49

    Valeu! Obrigado..

  7. #7 por Adalto em 31/05/2011 - 10:04

    Oi, Marcio

    Estava precisando de uma ajuda, eu fiz uma implementação simples seguindo o seu tutorial e tudo funcionou certinho, mas agora estou novamente tentando implementar em um outro problema mas estou com um erro no meu Controller já não sei mais o que verificar, a mensagem é essa:

    incompatible types
    required: java.util.list
    found: java.util.list

    Sendo que o meu metódo no GenericDao está assim:

    public List findAll()throws Exception{
    Session session = (Session) getEntityManager().getDelegate();
    return session.createCriteria(persitenceClass).list();
    }

    E no meu ItemController está assim:

    public List listaItem(){
    ItemDao dao = new ItemDao();
    try{
    return dao.findAll();
    }catch(SQLException exc){
    JOptionPane.showMessageDialog(null,”Problemas ao localizar os itens ”
    + exc.getLocalizedMessage());
    }
    return null;
    }

    Poderia me dar um ajuda ai?

    Obrigado!

  8. #8 por Adalto em 31/05/2011 - 10:06

    a mensagem com o erro ficou incompleta seria assim:

    incompatible types
    required: java.util.list
    found: java.util.list

  9. #9 por Adalto em 31/05/2011 - 10:07

    Opa.. rs percebi agora o comentário corta o qu está entre TAG’s =/

  10. #10 por MBallem em 31/05/2011 - 10:24

    Coloca um aqui: exc.getLocalizedMessage()
    um exe.printStackTrace() que dai vai te dar mais informações sobre o erro.

  11. #11 por Adalto em 31/05/2011 - 11:20

    Oi, Marcio

    Obrigado pelo retorno, mas o erro está no cód. não é em tempo de execução, será que podemos conversar via email?

    Valeu, abs!

  12. #12 por MBallem em 31/05/2011 - 11:51

    Ok, te enviei um email, mas acredito então que possa ser o import da List. Veja se não está importando o List da classe do pacote errado em alguma destas classes.
    O correto é o java.util.List

  13. #13 por João Neto em 29/09/2011 - 0:02

    Ola amigo eu estou fazendo uma tela seguindo seu código , usando postgres porém quando estou atualizando ou adicionando um registro no banco esta vindo o erro javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute native bulk manipulation query

    os registros estão sendo inseridos ou atualizados no banco porém o erro aparece . Você poderia me dar uma ideia para corrigir isso .
    Grato pela atenção .

  14. #14 por MBallem em 29/09/2011 - 11:20

    João Neto, não tenho resposta concreta sobre esse problema. Você chegou a testar com outro banco de dados? Outra coisa, traduzindo o erro, diz que você estaria tentando realizar um operação com vários dados ao mesmo tempo. Você está inserindo um a um ou está tentando inserir vários objetos ao mesmo tempo?

  15. #15 por João Neto em 29/09/2011 - 22:57

    Sim Marcio testei no banco mysql e postgreSQL e nos dois da o mesmo erro .ja olhei varias coisas aqui e nada me vem na cabeça do que possa ser rsrs ..ja fiz diretamento com o dao voltei pro controller .

  16. #16 por João Neto em 30/09/2011 - 1:44

    Marcio o problema esta no private void shutdown() ele passa o comando em.createNativeQuery(“SHUTDOWN”).executeUpdate();
    acredito que seja o “SHUTDOWN” que está dando o problema .

  17. #17 por João Neto em 30/09/2011 - 2:14

    Marcio acredito que descobri o problema é esse

    private void shutdown();

    esse é um comando especifico para HSQLDB .

    Acho que ele não deve fazer isso (shutdown da base) porque o Hibernate deve ter sido testado com um banco HSQLDB em modo “server”, não em modo “stand-alone” – onde você precisa do “shutdown”.

    Vou fazer uns teste pra ver se isso já conserta o erro ou ainda tenho que descobrir algo melhor .

  18. #18 por MBallem em 30/09/2011 - 11:49

    Oi João, você não deve usar o shutdown em outro banco de dados, é especifico para o HSQLDB. Eu citei isso em um quadro na seção “Classe GenericDao” do artigo. Você pode retirar esse comando sem problemas.

  19. #19 por João Neto em 30/09/2011 - 12:06

    Marcio obrigado , peço desculpas terminei que não lí muito rsrsr . falta de atenção .. mas foi bom que consegui resolver por mim mesmo srsr.

    Grato por sua atenção amigo.

  20. #20 por Leandro em 22/10/2011 - 15:51

    Parabéns, muito elegante seus códigos.

  21. #21 por MBallem em 21/01/2012 - 16:16

    O Megaupload saiu do ar por determinação da justiça americana, então não será possível baixar o pacote com as bibliotecas que eu tinha montado. Se guiem pelo nome das bibliotecas descritas na Figura 1.

  22. #22 por psicoppardo em 23/01/2012 - 17:46

    marcio teria como disponibilizar o fonte do projeto, pois não consigo fazer a classe hibernate (engenharia reversa)

  23. #23 por MBallem em 24/01/2012 - 15:31

    psicoppardo,
    adicionei os fontes no repositório github. Veja o link no final do artigo.
    T+

  24. #24 por Eliza Helena em 31/07/2012 - 17:56

    Gostaria primeiramente de parabenizá-lo pelo site. Para pessoas iniciantes em programação, assim como eu, suas explicações são 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 padrão para salvar datas/horas no mysql é yyyy/MM/dd hh:mm:ss. Para o que preciso bastaria o dia/mês e hora:minuto. Converti os formatos (conforme mostra o seu código dd/MM/yyyy hh:mm:ss). Vi na internet que existe a opção DATE_FORMAT do mysql para que possamos salvar no banco o formato que quisermos. No entanto, não sei como incluir essa opção do mysql na classe GenericDao. Pesquisei na Internet e vi esse exemplo:

    Criteria criteria = session.createCriteria(persistentClass).addOrder(Order.asc(“startTime”))
    .add(Restrictions.sqlRestriction(“DATE_FORMAT(this_.starttime, ‘%d-%c %H:%i’)”));

    porém assim não está funcionando. Será que poderias me ajudar? Agradeço desde já!

  25. #25 por Eliza Helena em 31/07/2012 - 18:38

    Continuei pesquisando e vi que essa função não 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 não o padrão do MYSQL DATETIME?

  26. #26 por MBallem em 31/07/2012 - 21:18

    Olá Eliza Helena!

    Acredito que não seja possível salvar como você está querendo. O que você poderia fazer é salvar em campos varchar ao invés de date/datetime/timestamp.

    Aqui nesse link: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-types.html
    tem os tipos de datas que o MySQL salva, olhe bem no final da página. Veja que os formatos são apenas aqueles, não é possível 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.

  27. #27 por Eliza Helena em 02/08/2012 - 9:56

    Ok. Obrigada pela dica.

  28. #28 por Alisson em 21/08/2012 - 15:55

    Eu tive o mesmo seguinte problema: could not execute native bulk manipulation query.
    pode ser problemas com sua HQL ou a versão do banco instalada…
    http://coisasdetecnologia.com.br/blog/2012/08/17/erro-no-postgres/

  29. #29 por MBallem em 21/08/2012 - 16:45

    Olá Alisson, com HQL não porque não usamos HQL no exemplo e sim Criteria. Talvez possa ser a versão do banco, mas acho não tenho certeza. Qual banco você está usando? O HSQLDB mesmo?
    Se for o HSQLDB, eu usei a versão 1.8.0 -> http://sourceforge.net/projects/hsqldb/files/hsqldb/

    Esse problema ocorre em todo o acesso ao banco ou em uma ação especifica como salvar, alterar ou alguma consulta?

  30. #30 por Alisson em 21/08/2012 - 16:52

    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 então gerou esse erro,dai atualizamos e funcionou…

  31. #31 por MBallem em 21/08/2012 - 17:07

    Ok Alisson.
    Por acaso você tentou ao invés de trocar a versão do banco, trocar apenas a versão do driver-jdbc?

  32. #32 por Alisson em 21/08/2012 - 17:26

    Então, eu ia fazer isto, mas como percebi que a versão do banco estava diferente, resolvi atualizar antes já que é o “padrão” do nosso sistema….
    Acho que a solução de trocar o driver também iria funcionar no caso de continuar com a versão 8.1 do banco… (ou ainda arrumar as hqls).

  33. #33 por Argyria em 07/10/2012 - 2:54

    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?

  34. #34 por MBallem em 07/10/2012 - 11:49

    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.

  35. #35 por Rodrigo em 17/10/2012 - 19:42

    Ae amigo, seguinte aqui no meu código 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.

  36. #36 por MBallem em 17/10/2012 - 21:05

    Olá Rodrigo, parece que tem alguma anotação faltando no código. Mas você pode gerar o banco de dados sem usar essa classe GeraBanco. Através da configuração “hibernate.hbm2ddl.auto” o Hibernate é capaz de gerar as tabelas na momento que você tentar executar algum método de persistência.

  37. #37 por Rodrigo em 17/10/2012 - 23:44

    Ola, ta estorando um erro aqui, acho que tem a ver com a mesma anotação 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”);

  38. #38 por Rodrigo em 17/10/2012 - 23:53

    ae, esquece ja resolvi esse problema..

  39. #39 por MBallem em 17/10/2012 - 23:58

    Ok Rodrigo, legal que resolveu.

  40. #40 por Rodrigo em 18/10/2012 - 0:07

    Boa noite, depois de eu adicionar todas as anotações e bibliotecas necessárias 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)
    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,,
    agradeço de puder me ajudar. Abraço

  41. #41 por MBallem em 18/10/2012 - 0:14

    Rodrigo, esse tipo de erro acontece quando tem incompatibilidade entre as versões das bibliotecas. Você baixou as bibliotecas ou está usando as listadas no arquivo pom.xml que disponibilizei no projeto para download?

  42. #42 por Rodrigo em 18/10/2012 - 0:23

    Sim entendo, mas onde voce disponibilizou para download?

  43. #43 por MBallem em 18/10/2012 - 0:25

    No final do artigo, tem um link para o PDF do artigo e outro link para repositório github, onde você pode fazer o download.

  44. #44 por Rodrigo em 18/10/2012 - 0:37

    Ah não tinha visto kk, vlw

  45. #45 por Rodrigo em 18/10/2012 - 1:11

    Baixei todas as versões que estão 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.html#StaticLoggerBinder 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 jpaTesteSwing.Controller.ProdutoController.salvar(ProdutoController.java:12)
    at jpaTesteSwing.View.FrameCadastro.onClickSalvar(FrameCadastro.java:51)
    at jpaTesteSwing.View.FrameCadastro$1.actionPerformed(FrameCadastro.java:41)

  46. #46 por MBallem em 18/10/2012 - 11:34

    Rodrigo, parece que o problema agora ficou mais visível, acredito que seja problema com a biblioteca slf4j, conforme informa a exceção: org.slf4j.impl.StaticLoggerBinder.
    Segundo relatado no link http://www.slf4j.org/codes.html, você pode entender mais sobre esse erro.

  47. #47 por Rodrigo em 18/10/2012 - 18:26

    Eu li sobre o erro, baixei as api’s que dizia que resolvia o problema mas mesmo assim persisti o erro. Não tem como voce me disponibilizar os jar’s que voce usou no seu projeto?

    Agradeço desde já, abraço

  48. #48 por MBallem em 18/10/2012 - 20:32

    Rodrigo, coloquei nesse servidor de arquivos:
    http://www.4shared.com/folder/iMQTFc-L/_online.html

  49. #49 por Rodrigo em 19/10/2012 - 0:22

    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.., não entendi porque, e também não está salvando dados na tabela

    Boa noite

  50. #50 por Rodrigo em 19/10/2012 - 0:34

    Corrigi o problema de salvar dados, parece esta tudo funcionando. Mas ainda persisti o erro que citei acima

  51. #51 por MBallem em 19/10/2012 - 11:20

    oi Rodrigo, isso não é erro, é aviso. Ele pede que você utilize um arquivo de configuração para log. Isso não é obrigatório, mas caso queira incluir, de uma lida aqui> http://logging.apache.org/log4j/1.2/manual.html

  52. #52 por Rodrigo em 19/10/2012 - 13:12

    Mas caso eu não coloque, pode deixar o sistema mais lento?

  53. #53 por MBallem em 19/10/2012 - 14:37

    Não Rodrigo, não deixara mais lento. O log serve para você ter certas informações do funcionamento do seu sistema, principalmente para te informar erros ocasionados no processamento do seu aplicativo.

  54. #54 por Rodrigo em 19/10/2012 - 16:03

    Ok obrigado pela ajuda, tenho certeza que ajudou muitos iniciantes, grande abraço

  55. #55 por Hs em 08/12/2012 - 10:27

    Olá, poderia disponibilizar novamente o pacote com as bibliotecas?
    Agradeço.

  56. #56 por MBallem em 08/12/2012 - 11:36

    Olá Hs. Faça o download do projeto no link que disponibilizei pelo github no final do tutorial e importe as bibliotecas necessárias através do maven.

  57. #57 por Vera em 16/05/2013 - 7:16

    This post is truly a nice one it helps new net visitors, who are
    wishing in favor of blogging.

  58. #58 por MBallem em 16/05/2013 - 11:29

    Thank you Vera!

  59. #59 por James Daniel em 30/05/2013 - 18:15

    Fala Marcio! Antes de mais nada, parabéns 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)
    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 não ocorrer mais ?

    Muito Obrigado,

    James

  60. #60 por James Daniel em 30/05/2013 - 19:00

    Marcio, consegui resolver fazendo isto comentando no método close() no código 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 após o commit() automaticamente. Pode ser por isso que ele acusava o erro após eu tentar fechar manualmente.

    Att.,

    James

  61. #61 por MBallem em 30/05/2013 - 19:26

    Olá James!
    O commit() não fecha a sessão. 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 não será lançada a exceção.

    Estou levando em consideração o exemplo do meu código. Quando você cria uma instancia do Dao é criado um EntityManager e depois de salvar um objeto esse EntityManager é fechado. Então, nessa instancia do Dao você não 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 alteração no código:

    public GenericDao() {
            //remova o entitymanager do construtor e passe ele para o método getEntityManager().
            //this.entityManager = EntityManagerUtil.getEntityManager();
            this.persistentClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
        }
     
        public EntityManager getEntityManager() {
            return EntityManagerUtil.getEntityManager();
        }
    
  62. #62 por James Daniel em 31/05/2013 - 7:51

    Obrigado pela pronta resposta, Márcio. Estou longe do meu computador agora, mas assim que chegar vou testar o que você me passou.
    Eu tinha feito uma classe para testar uma inserção seguida de uma consulta (findById) usando o mesmo DAO. Assim que estiver perto do meu micro testo e retorno.

    Obrigado,

    James

  63. #63 por James Daniel em 01/06/2013 - 15:10

    Exatamente, Márcio! 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 memória e por comodidade (rs). Na sua opinião vale a pena reutilizar o DAO para várias operações ou sempre usar um para cada ? Existe alguma vantagem em cada uma dessas abordagens ?

    Desculpe a demora para responder.

    Att.,

    James

  64. #64 por MBallem em 01/06/2013 - 16:09

    Olá James. Não existe diferença em relação a performance. Seria mais relacionado individualmente ao padrão de seus projetos. Escolha uma forma de usar e siga em frente.

  1. Utilizando Swing com Hibernate (SessionFactory) « Programando com Java
%d blogueiros gostam disto: