Ajuda com passagem por referência em Java

Oi GUJ,
pessoal, sei que java não trabalha com ponteiros como em C++ (adoro C++,rs).

Estou com um problema que não consigo entender porque volta null no objeto ‘usuario’:

        //Chamando o método 'login'
        Usuario usuario = new Usuario();
        BancoDados bd = new BancoDados();
        String status = bd.login(email, senha, usuario);
    //Método login
    public String login(String email, String senha, Usuario usuario) {
        String status = "login_correto";
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();
        
        try {
            Query query = session.createQuery("from Usuario where email = '" + email + "' and senha = '" + senha + "'");
            if (query.list().size() > 0){
                usuario = (Usuario) query.list().get(0);
                System.out.println("BANCO DADOS - LOGIN");
                usuario.exibir();
            }else{
                status = "login_incorreto";
            }
        } catch (HibernateException he) {
            System.out.println("Exceção em Banco de dados - login:" + he.getCause().getLocalizedMessage());
            status = he.getCause().getLocalizedMessage();
        }

        return status;
    }

Então quando ele termina de executar o método login, o objeto usuario que eu referenciei volta null…
O que esta errado ?

Abraços.

ola, respondendo sua questao:

porque a posição 0 da lista retorna null, linha 10. Isso se deve ao fato de sua consulta nao retornar nenhum resultado.

Agora algumas consideraçoes do codigo:

um metodo que recebe login, senha e usuario dps retorna uma string nao me parece muito bem elaborado.
Da a impressao que vc depende da string de retorno para fazer o fluxo da aplicação, tecnica conhecida como Orientacao a Strings…

envie login e senha e retorne um usuario ou um boolean indicando se o usuario foi logado com sucesso.

tambem nao concatene strings para formar queries como na linha 8.

abrassss

Em Java nao existe passagem por referencia. Em Java toda passagem é por VALOR.

Voce debugou essa parte do codigo? Verificou se sua consulta esta retornando algum registro?

usuario = (Usuario) query.list().get(0); 

Pode ser que sua consulta nao retorne nada e o usuario entao aponte para null.

Verifica ae…

[]'s

[quote=denislima]Em Java nao existe passagem por referencia. Em Java toda passagem é por VALOR.

Voce debugou essa parte do codigo? Verificou se sua consulta esta retornando algum registro?

usuario = (Usuario) query.list().get(0); 

Pode ser que sua consulta nao retorne nada e o usuario entao aponte para null.

Verifica ae…

[]'s[/quote]
Então cara, eu testei e ele retorna sim, tanto que fiz um print logo abaixo e ele mostra, mas quando ele sai do método, o objeto usuario esta com todos os valores setados como ‘null’.

EDIT: Acho que java tem passagem por referência sim cara.

Fala brow,

Isso aqui:

query.list().get(0)

Esta retornando algum registro?

[quote=renanreismartins]ola, respondendo sua questao:

porque a posição 0 da lista retorna null, linha 10. Isso se deve ao fato de sua consulta nao retornar nenhum resultado.

Agora algumas consideraçoes do codigo:

um metodo que recebe login, senha e usuario dps retorna uma string nao me parece muito bem elaborado.
Da a impressao que vc depende da string de retorno para fazer o fluxo da aplicação, tecnica conhecida como Orientacao a Strings…

envie login e senha e retorne um usuario ou um boolean indicando se o usuario foi logado com sucesso.

tambem nao concatene strings para formar queries como na linha 8.

abrassss[/quote]

Então Renan,
eu estou retornando uma string para poder tratar melhor as exceções que podem ser lançadas.
Na verdade eu queria passar o objeto usuario e no mesmo método retornar a string com o status da operação entendeu ?

E sobre não concatenar string na query eu não entendi, por que não se pode concatenar ?

Abraços.

[quote=kenneth]Fala brow,

Isso aqui:

query.list().get(0)

Esta retornando algum registro?[/quote]
Tah sim brother.

oi Valter, entendi sim… ainda acho que controlar o fluxo por strings pode ser ruim, lance as exceçoes.

Nao é legal concatenar devido aos perigos de um SQL Injection. Bem como existem outras maneiras de deixar seu codigo muito mais elegante.

 Query query = session.createQuery("from Usuario where email = :email and senha = senha");  

query.setParameter("email", email);

alem de poder usar Criteria.

Sugiro que vc faça um debug do metodo inteiro, acompanhe seu objeto usuario e veja em qual linha ele se torna nulo

grande abrasss

[quote=Valter Henrique][quote=denislima]Em Java nao existe passagem por referencia. Em Java toda passagem é por VALOR.

Voce debugou essa parte do codigo? Verificou se sua consulta esta retornando algum registro?

usuario = (Usuario) query.list().get(0); 

Pode ser que sua consulta nao retorne nada e o usuario entao aponte para null.

Verifica ae…

[]'s[/quote]
Então cara, eu testei e ele retorna sim, tanto que fiz um print logo abaixo e ele mostra, mas quando ele sai do método, o objeto usuario esta com todos os valores setados como ‘null’.

EDIT: Acho que java tem passagem por referência sim cara.[/quote]

EM JAVA TODA PASSAGEM EH POR VALOR!!!, NAO EXISTE PASSAGEM POR REFERENCIA EM JAVA!

Da uma olhada nesses topicos, eles discutem isso tbem:
http://www.guj.com.br/posts/list/24894.java
http://www.guj.com.br/posts/list/19722.java

[quote=renanreismartins]oi Valter, entendi sim… ainda acho que controlar o fluxo por strings pode ser ruim, lance as exceçoes.

Nao é legal concatenar devido aos perigos de um SQL Injection. Bem como existem outras maneiras de deixar seu codigo muito mais elegante.

 Query query = session.createQuery("from Usuario where email = :email and senha = senha");  

query.setParameter("email", email);

alem de poder usar Criteria.

Sugiro que vc faça um debug do metodo inteiro, acompanhe seu objeto usuario e veja em qual linha ele se torna nulo

grande abrasss
[/quote]

Entendi Renan (sobre concaternar a string na query).
Então cara, ele dentro do try não é nulo, mas quando ele sai do método ele se torna nulo.

[quote=denislima][quote=Valter Henrique][quote=denislima]Em Java nao existe passagem por referencia. Em Java toda passagem é por VALOR.

Voce debugou essa parte do codigo? Verificou se sua consulta esta retornando algum registro?

usuario = (Usuario) query.list().get(0); 

Pode ser que sua consulta nao retorne nada e o usuario entao aponte para null.

Verifica ae…

[]'s[/quote]
Então cara, eu testei e ele retorna sim, tanto que fiz um print logo abaixo e ele mostra, mas quando ele sai do método, o objeto usuario esta com todos os valores setados como ‘null’.

EDIT: Acho que java tem passagem por referência sim cara.[/quote]

EM JAVA TODA PASSAGEM EH POR VALOR!!!, NAO EXISTE PASSAGEM POR REFERENCIA EM JAVA! [/quote]

(tem mesmo necessidade dessa caixa alta cara ?)

[quote=Valter Henrique][quote=denislima][quote=Valter Henrique][quote=denislima]Em Java nao existe passagem por referencia. Em Java toda passagem é por VALOR.

Voce debugou essa parte do codigo? Verificou se sua consulta esta retornando algum registro?

usuario = (Usuario) query.list().get(0); 

Pode ser que sua consulta nao retorne nada e o usuario entao aponte para null.

Verifica ae…

[]'s[/quote]
Então cara, eu testei e ele retorna sim, tanto que fiz um print logo abaixo e ele mostra, mas quando ele sai do método, o objeto usuario esta com todos os valores setados como ‘null’.

EDIT: Acho que java tem passagem por referência sim cara.[/quote]

EM JAVA TODA PASSAGEM EH POR VALOR!!!, NAO EXISTE PASSAGEM POR REFERENCIA EM JAVA! [/quote]

(tem mesmo necessidade dessa caixa alta cara ?)[/quote]

hehehe… desculpa… nao interprete mal…coloquei mais para destacar a frase msm… nao falei “gritando” nao…

da uma olhada nesses topicos eles discutem esse assunto:
http://www.guj.com.br/posts/list/24894.java
http://www.guj.com.br/posts/list/19722.java

abracos

verifique se vc nao passa nulo pra ele dentro do metodo exibir()…

sobre as strings e exceçoes, creio que vc encontrará uma boa explicação no blog da caelum ou apostila do fj11

abrassss

[quote=denislima][quote=Valter Henrique][quote=denislima][quote=Valter Henrique][quote=denislima]Em Java nao existe passagem por referencia. Em Java toda passagem é por VALOR.

Voce debugou essa parte do codigo? Verificou se sua consulta esta retornando algum registro?

usuario = (Usuario) query.list().get(0); 

Pode ser que sua consulta nao retorne nada e o usuario entao aponte para null.

Verifica ae…

[]'s[/quote]
Então cara, eu testei e ele retorna sim, tanto que fiz um print logo abaixo e ele mostra, mas quando ele sai do método, o objeto usuario esta com todos os valores setados como ‘null’.

EDIT: Acho que java tem passagem por referência sim cara.[/quote]

EM JAVA TODA PASSAGEM EH POR VALOR!!!, NAO EXISTE PASSAGEM POR REFERENCIA EM JAVA! [/quote]

(tem mesmo necessidade dessa caixa alta cara ?)[/quote]

hehehe… desculpa… nao interprete mal…coloquei mais para destacar a frase msm… nao falei “gritando” nao…

da uma olhada nesses topicos eles discutem esse assunto:
http://www.guj.com.br/posts/list/24894.java
http://www.guj.com.br/posts/list/19722.java

abracos[/quote]

Tranquilo brother valeu pelos links.

[quote=renanreismartins]verifique se vc nao passa nulo pra ele dentro do metodo exibir()…

sobre as strings e exceçoes, creio que vc encontrará uma boa explicação no blog da caelum ou apostila do fj11

abrassss[/quote]
Valeu Renan, já baixei a apostila,rs.

Galera, seguindo a orientações de todos, resolvi e ficou assim:

        BancoDados bd = new BancoDados();
        Usuario usuario = bd.login(email, senha);

        if (usuario == null){
            status = "login_incorreto";
        }
         
        //esse método trata a exceções
        retornarStatus(request, response, status, usuario);
    //Método login
    public  Usuario login(String email, String senha) {
        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        session.beginTransaction();

        Usuario usuario = null;

        try {
            Query query = session.createQuery("from Usuario where email = :email and senha = :senha");
            query.setParameter("email", email);
            query.setParameter("senha", senha);

            if (query.list().size() > 0){
                usuario = (Usuario) query.list().get(0);
            }
        } catch (HibernateException he) {
            System.out.println("Exceção em Banco de dados - login:" + he.getCause().getLocalizedMessage());
        }

        return usuario;
    }

Valeu galera.

E ai Renan, ficou elegante agora ?rs (brincadeira,rs)

Abraços.

sim… melhor… agora falta soh fechar a transacao e a session rsrs

abrasssss

[quote=renanreismartins]sim… melhor… agora falta soh fechar a transacao e a session rsrs

abrasssss[/quote]

Renan, sou novo no Hibernate velho, pelo que vi faltou um :

            session.clear();
            session.close();

Eh isso ? (para fechar a transação e a sessão corretamente ? )

n esquenta é assim mesmo… vc deve fazer algo como:

Transaction tx = session.beginTransaction();  
// codigo....
tx.commit();

session.close();

abrassss

[quote=renanreismartins]n esquenta é assim mesmo… vc deve fazer algo como:

Transaction tx = session.beginTransaction();  
// codigo....
tx.commit();

session.close();

abrassss[/quote]

Eh que eu achei que o hibernate já fazia isso automaticamente.
Isso conserva o pool ?