Iniciante em hibernate

11 respostas
J

Pessoal, estou começando a estudar o hibernate. Quero utilizá-lo com anotações.

A maioria dos tutoriais que vi até agora não dão muitos exemplos de como usar o hibernate para Web (com jsp). Como que posso fazer isso? Vou ter minha entidade normal, e um arquivo jsp normal tambem, que enviará tudo para um Servlet e no servlet que irei criar o objeto e a session do hibernate e persistir os dados?

Vi um exemplo onde o cara cria um DAO usuario (por exemplo) e cria metodos para inserir, excluir, etc. Basicamente os metodos dele ficavam com esse codigo:

Session session = factory.openSession();

session.delete(us);

session.flush();

session.close();

Ja em outro exemplo o cara chama direto os metodos da classe SessionFactory, mesmo usando anotações posso criar DAOs, como nesse exemplo acima? Fiquei em dúvida, pois nos exemplo que vi sem DAO, tem um aviso dizendo para criar uma vez só a sessão durante a execução da aplicação, mas nao entendi como fazer isso. Com DAO eu entedi.

Desde já agradeço.

11 Respostas

kicolobo

Opa,

você usa o Hibernate em uma aplicação web quase que exatamente como faria em uma aplicação não web, ou seja, o trabalho de carregamento e persistência continua sendo executado na camada de modelo mesmo (exatamente como nos modelos mais banais que você pode encontrar na Internet).

Seu controlador deve chamar os métodos de persistência na camada de modelo e, em seguida, os resultados serão transferidos pelo controlador para a camada de visualização, aonde a coisa muda um pouco de figura.

Pra começar, se você tiver fechado a sua sessão no carregamento, enviar a sua entidade para a camada de visualização e esta estiver configurada como carregamento lazy, ao chamar atributos desta classe que são carregados sob demanda você terá uma excessão do tipo LazyInitialization (acho que é este o nome). Sendo assim, nestes casos o ideal é não usar carregamento lazy, e sim já enviar para a camada de visualização o seu objeto “completo”.

Agora, como você vai enviar os seus objetos do controlador para a camada de visualização vai variar de acordo com o framework que estiver usando.

lazarento

Você pode usar o padrão DAO sem problemas , as anotações ai servirão para fzer o mapeamento das propriedades do teu “Bean” que antes era feito no arquivo xml.

J

Ok.
Entendi.
Muito obrigado mesmo pelas dicas.

Vou usar o padrao DAO sim, acho que fica mais organizado.
Pelo exemplo que vi aqui, dentro do DAO são criados os metodos: inserir, alterar e excluir, que chamam os metodos save, update e delete, respectivamente, da classe sessionFactory. Basicamente são esses os comandos? Existem algum tipo de comando pra pesquisa, por exemplo, ou faço esses comandos padroes com hibernate e alguns personlizados faço com SQL normal?
Estou com essa dúvida, pois não sei como fazer para validar um login sem usar uma query personalizada. Para validar o login vou ter que fazer com sql noral?

lazarento

JeffersonJCosta:
Ok.
Entendi.
Muito obrigado mesmo pelas dicas.

Vou usar o padrao DAO sim, acho que fica mais organizado.
Pelo exemplo que vi aqui, dentro do DAO são criados os metodos: inserir, alterar e excluir, que chamam os metodos save, update e delete, respectivamente, da classe sessionFactory. Basicamente são esses os comandos? Existem algum tipo de comando pra pesquisa, por exemplo, ou faço esses comandos padroes com hibernate e alguns personlizados faço com SQL normal?
Estou com essa dúvida, pois não sei como fazer para validar um login sem usar uma query personalizada. Para validar o login vou ter que fazer com sql noral?

Da uma pesquisada sobre a API Criteria do Hibernate , é bem poderosa nessa parte.

J

lazarento valeu pela dica.

Dei uma pesquisada aqui e consegui fazer esse método:

public boolean ValidarLogin(Usuario usuario) throws Exception{
        Session session = factory.openSession();

        Criteria criteria = session.createCriteria(Usuario.class);

        Criterion login = Restrictions.eq("login", usuario.getLogin());
        criteria.add(login);  
        Criterion senha = Restrictions.eq("senha", usuario.getSenha());
        criteria.add(senha);

        criteria.uniqueResult();
        return(false);
    }

Coloquei esse metodo dentro do meu UsarioDAo, fiz errado?
Ainda nao rodei, acho que nem vai funcionar, mas postei aqui pra esclarecer algumas duvidas: como vou retornar se o login esá correto ou nao (true ou false)? O que o metodo uniqueResult me retorna? Estou no caminho certo, sóq uero terminar esse método pra me retornar se o login e a senha estao corretos.

Desde ja agradeço

lazarento
JeffersonJCosta:
lazarento valeu pela dica.

Dei uma pesquisada aqui e consegui fazer esse método:

public boolean ValidarLogin(Usuario usuario) throws Exception{
        Session session = factory.openSession();

        Criteria criteria = session.createCriteria(Usuario.class);

        Criterion login = Restrictions.eq("login", usuario.getLogin());
        criteria.add(login);  
        Criterion senha = Restrictions.eq("senha", usuario.getSenha());
        criteria.add(senha);

        criteria.uniqueResult();
        return(false);
    }

Coloquei esse metodo dentro do meu UsarioDAo, fiz errado?
Ainda nao rodei, acho que nem vai funcionar, mas postei aqui pra esclarecer algumas duvidas: como vou retornar se o login esá correto ou nao (true ou false)? O que o metodo uniqueResult me retorna? Estou no caminho certo, sóq uero terminar esse método pra me retornar se o login e a senha estao corretos.

Desde ja agradeço

Então , ta no caminho certo sim.

Esse seu
criteria.uniqueResult();
te retorna um Object , então voce pode verificar se for null quer dzer que não existe o usuário ai se retorna false , se for diferente retorna true;
J

Valeu

Entao posso colocar esse uniqueResult dentro de um if, comparando com NULL?
Nao sabia disso
Valeu pelas dicas.
Abraços.

J

Pessoal.

Surgiu mais uma dúvida agora.
Fiz o seguinte método, dentro da minha DAO usuario:

public boolean ValidarLogin(Usuario usuario) throws Exception{
        Criterion login = Restrictions.eq("login", usuario.getLogin());
        criteria.add(login);  
        Criterion senha = Restrictions.eq("senha", usuario.getSenha());
        criteria.add(senha);

        if ( criteria.uniqueResult() == null )
        {
            return(true);
        }
        else
        {
            return(false);
        }
    }

Esse metodo esta correto? Vai funcionar?
A minha maior dúvida é se coloquei esse método no lugar certo? Como estou querendo fazer tudo em MVC, estou preocupado de estar indo contra as regras desse padrão. Posso deixar esse metodo dentro do meu DAO mesmo, e no ServletLogin acessá-lo e fazer o redirecionamento dentro desse servlet?

Na minha tabela de usuarios, salvo também o nome do mesmo, como posso recupera-lo e depois, no Servlet, jogha-lo para uma sessão? Posso fazer isso dentro desse meu metodo e usando criteria?

Desde ja agradeço

LPJava

veja esses posts:
Hibernate + JSF + Mysql
Hibernate + JPA + JSF

flw.

J

Valeu
Vou dar uma olhda, já estou olhando até, mas estou tendo problemas com links aki, vou reativar um tópico antigo meu pra nao misturar as coisas aqui, depois posto os resultados.
Valeu mesmo

J

LPJava, valeu pelas dicas, muito legais, me ajudaram, mas infelizmente não está funcionando. Nao sei porque, minha entidade (bean) está correto e com anotações, já configurei meu BD e o hibernate.cfg.xml. fiz os DAOs para as entidades e nada. Quando passo os dados do jsp para o servlet e tento salvar, nao acontece nada, a tela fica em branca, nem erro da, nao sei mais o que fazer. Vou continuar pesquisando. Estou nisso ha um bom mtepo, deve ser um erro bobo, mas que esta consumindo meu tempo e paciencia. Comecei fazendo um aplicativo corporativo, com EJB e tudo mais e nao foi, agora somente o projeto Web com Hiberante tambem nao esta indo, se quiser que poste algum código, me fale qual.

Agradeço a ajuda e paciencia de todos.

Criado 12 de janeiro de 2010
Ultima resposta 14 de jan. de 2010
Respostas 11
Participantes 4