Probleminha com Hibernate

9 respostas
skekeu

Bom dia galera,

To começando agora com Hibernate e estou com um probleminha aki.....

É o seguinte:

Quando cadastro um novo usuário, só consigo fazer login com ele depois de dar um "clean and biuld project(netbeans 5.0)", antes disso fica retornando usuário inválido...

Não sei se fiz os métodos de forma correta....
se puderem me ajudar, agradeceria muito

Login
package modelo;

import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import javax.persistence.*;

@Entity()
@Table(name="login")

public class Login extends org.apache.struts.action.ActionForm {
    
    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    @Column()
    private int cod;
    @Column()
    private String login;
    @Column()
    private String senha;
    @Column()
    private String perfil;
    @Column()
    private String nome;

//...getters e setters ...
Action
package controle;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import modelo.Login;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionForward;
import persistencia.LoginDao;


public class LoginAction extends Action {   
    
   
    public ActionForward execute(ActionMapping mapping, ActionForm  form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
        Login login = (Login)form;
        LoginDao ld = new LoginDao();
        String resp ="";        
        
        try{
        
         if(ld.fazLogin(login)){         
         request.getSession().setAttribute("sessao",login.getLogin());
         resp = "ok_login";
         }   
         else{
         request.setAttribute("erro","<img align='absmiddle' src='images/erro.gif'/> Usuário e/ou senha inválidos");
         resp = "erro_login";
         } 
        
        }catch(Exception e){
        request.setAttribute("erro",e.getMessage());
        resp = "erro_sistema";
        }
        return mapping.findForward(resp);
    }
}
DAO (acho q aki q to fazendo "m")
package persistencia;

import java.util.List;
import modelo.Login;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;


public class LoginDao {
    
Session session;
Transaction transaction;
Query query;
Criteria criteria;


public boolean fazLogin(Login login)throws Exception{ //Faz login no sistema
session = HibernateUtil.getSession();
transaction = session.beginTransaction();
query = session.createQuery("from Login l where l.login = :login and l.senha = :senha");
query.setString("login",login.getLogin());
query.setString("senha",login.getSenha());
List lista = query.list();
if(lista.size()!=0){
return true;
}
else{
return false;
}
} 

public List pegaNome(String sessao)throws Exception{
session = HibernateUtil.getSession();
transaction = session.beginTransaction();
query = session.createQuery("from Login lo where lo.login = :login");
query.setString("login",sessao);
return query.list();
}

public boolean verificaLogin(Login login)throws Exception{ //pra não deixar gravar 2 usuarios iguais
session = HibernateUtil.getSession();
transaction = session.beginTransaction();
query = session.createQuery("from Login log where log.login = :login");
query.setString("login",login.getLogin());
List lista = query.list();
if(lista.size()==0){
return true;
}
else{
return false;
}
} 

public void gravaUsuario(Login login)throws Exception{
session = HibernateUtil.getSession();
transaction = session.beginTransaction();
session.save(login);
transaction.commit();
}
    
}

9 Respostas

G

Tenta o seguinte:

public void gravaUsuario(Login login)throws Exception{  
   session = HibernateUtil.getSession();  
   transaction = session.beginTransaction();  

   session.save(login);  
   session.flush();

   transaction.commit();  
}
skekeu
Gbzao!:
Tenta o seguinte:
public void gravaUsuario(Login login)throws Exception{  
   session = HibernateUtil.getSession();  
   transaction = session.beginTransaction();  

   session.save(login);  
   session.flush();

   transaction.commit();  
}

Depois que coloquei o session.flush() melhorou, mas ainda assim as vezes acontece...tipo se cadastro mais d 2 usuarios, acontece a mesma coisa, só da pra fazer login com eles depois que dou um "clean and build project".

ajuda ai gente....não sei o q fazer.

G

Coloca o flush depois do commit.

Seus objetos estão ficando no estado Persisted.
Nesse estado os dados já foram persistidos, mas não necessariamente no banco, e sim na memória da Session.

O flush() obriga, o session a realizar essas tarefas no banco.

skekeu

Gbzao!:
Coloca o flush depois do commit.

Seus objetos estão ficando no estado Persisted.
Nesse estado os dados já foram persistidos, mas não necessariamente no banco, e sim na memória da Session.

O flush() obriga, o session a realizar essas tarefas no banco.

Caramba, continua a mesma coisa…
Se eu inserir mais de 2 registros…acontece a mesma coisa…

Percebi que até o metodo que fiz pra verificar se o login já existe, as vezes falha e passa direto.

public boolean verificaLogin(Login login)throws Exception{ //pra não deixar gravar 2 usuarios iguais session = HibernateUtil.getSession(); transaction = session.beginTransaction(); query = session.createQuery("from Login log where log.login = :login"); query.setString("login",login.getLogin()); List lista = query.list(); if(lista.size()==0){ return true; } else{ return false; } }

E

Cara, vc pode fazer o seguinte: Cadastra o usuario e vai no console do seu banco pra ver se ele ta lá antes de "“clean and biuld project”. se o cara tiver la o problema não é o hibernate. Pode ser alguma coisa no server (Eu acho rsrsrs).

skekeu

egamorim:
Cara, vc pode fazer o seguinte: Cadastra o usuario e vai no console do seu banco pra ver se ele ta lá antes de "“clean and biuld project”. se o cara tiver la o problema não é o hibernate. Pode ser alguma coisa no server (Eu acho rsrsrs).

já fiz isso…o usuario ta no banco e mesmo assim não loga…
não sei mais o que pode ser… :x

skekeu

Alguem mais tem alguma solução pra isso???
Me ajudem por favor…

Valew!!!

B

Em todos seus métodos de busca você tem transaction = session.beginTransaction();Isso não é necessário, fora que essa transação não está sendo finalizada, ou seja, fica rodando na sua sessão.

skekeu

Valew cara…acho que era isso mesmo.
Depois que tirei o beginTransaction() das consultas, parece que ficou tudo OK.

Nem sei como agradecer…valew mesmo…

Muito obrigado a todos que deram sugestões… :wink:

Criado 22 de julho de 2009
Ultima resposta 23 de jul. de 2009
Respostas 9
Participantes 4