Problema com Hibernate

4 respostas
pic_mute

daew pessoal, estou iniciando com o Hibernate.
Estou fazendo um sistema que possui uma classe chamada “Gerencia” que gerencia o Hibernate

public class Gerencia {
    private static Session se;
    
    //~--- constructors -------------------------------------------------------
    
    /** Creates a new instance of Gerencia */
    public Gerencia() {}
    
    //~--- methods ------------------------------------------------------------
    
    /**
     * Altera o Objeto
     * @param obj objeto a ser alterado no banco
     */
    public static void altera(Object obj) throws HibernateException {
        se = Sessao.getSession();
        Transaction tr = se.beginTransaction();
        se.update(obj);
        se.flush();
        tr.commit();
        se.close();
    }
    
    
    /**
     * Exclui o Objeto
     * @param obj objeto a ser excluido no banco
     */
    public static void exclui(Object obj) throws HibernateException {
        se = Sessao.getSession();
        Transaction tr = se.beginTransaction();
        se.delete(obj);
        se.flush();
        tr.commit();
        se.close();
    }
    
    /**
     * Inclui o Objeto
     * @param obj objeto a ser salvo no banco
     */
    public static void inclui(Object obj) throws HibernateException {
        se = Sessao.getSession();
        Transaction tr = se.beginTransaction();
        try{
            se.save(obj);
            se.flush();
            tr.commit();
            se.close();
        }catch(HibernateException e){
            e.printStackTrace();
        }
        
    }
    
    /**
     *carrega uma classe q tenha chave primária única
     */
    public static Object carrega(Class cla,Integer pk){
        Object obj;
        try{
            se = Sessao.getSession();
            se.clear();
            //se.close();
            Transaction tr = se.beginTransaction();
            obj = se.load(cla,pk);
            se.flush();
            tr.commit();            
        } catch(HibernateException e){
            obj = null;
            e.printStackTrace();
        }
        return obj;
    }
    
    
    /**
     * Inclui ou salva o Objeto
     * @param obj objeto a ser salvo no banco
     */
    public static void incluiOuAltera(Object obj) throws HibernateException {
        se = Sessao.getSession();
        Transaction tr = se.beginTransaction();
        try{
            se.saveOrUpdate(obj);
            se.flush();
            tr.commit();
            se.close();
        }catch(HibernateException e){
            e.printStackTrace();
        }
        
    }
    
    /**
     * Pega o objeto do banco conforme a classe e os parametros passados.
     * @param key codigo do objeto
     * @param nome Classe do Objeto
     * @param chave chave primária do objeto no banco.
     * @return Object (fazer Cast para o q precisar)
     */
    public static Object selecionaPorCodigo(int key, String nome,
            String chave) {
        se = Sessao.getSession();
        Transaction tr = se.beginTransaction();
        Object obj   = null;
        Query  query = se.createQuery("select obj from " + nome
                + " as obj where obj." + chave + " = "
                + key);
        Iterator it = query.iterate();
        while (it.hasNext()) {
            obj = (Object) it.next();
        }
        se.flush();
        tr.commit();
        //se.close();
        return obj;
    }
    
    public static Object selecionaChaveComposta(Class classe,Serializable ser) {
        return Sessao.getSession().get(classe,ser);
    }
    
    /**
     * Pega o objeto do banco conforme o sql passado.
     * @param sql ex: select obj from "+ nome +" as obj where obj."+ chave +" = "+key
     * @return Object (fazer Cast para o q precisar)
     */
    public static Object selecionaSql(String sql) {
        try {
            se = Sessao.getSession();
            Transaction tr = se.beginTransaction();
            Object   obj   = null;
            Query    query = se.createQuery(sql);
            Iterator it    = query.iterate();
            while (it.hasNext()) {
                obj = (Object) it.next();
            }
            se.flush();
            tr.commit();
            se.close();
            return obj;
        } catch (Exception e) {
            return null;
        }
    }
    
    /**
     * Pega todos os objetos do banco conforme a classe passada.
     * @param nome Classe dos objetos
     * @return Iterator
     */
    public static Iterator selecionaTodos(String nome) {
        se = Sessao.getSession();
        Transaction tr = se.beginTransaction();
        Query    query = se.createQuery("from " + nome + " obj");
        Iterator it    = query.iterate();
        se.flush();
        tr.commit();
        se.close();
        return it;
    }
    
    public static List retornaLista(String hql) {
        try {
            se = Sessao.getSession();
            Transaction tr = se.beginTransaction();
            Query    query = se.createQuery(hql);
            List list = query.list();
            se.flush();
            tr.commit();
            se.close();
            return list;
        } catch (HibernateException e) {
            e.printStackTrace();
            return null;
        }
    }
    
    //~--- get methods --------------------------------------------------------
    
    /**
     * retorna a sessão
     * @param
     */
    public static Session getSessao() throws HibernateException {
        se = Sessao.getSession();
        return se;
    }
}

o problema que acontece, é que quando vou usar collections aparece o seguinte erro:

org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions

alguém sabe exatamente o que quer dizer?

4 Respostas

Giulliano

putz cara…seja mais objetivo no seu texto…coloque apenas a parte do código q vc acredita estar errada entre as tgs code /code

tem uns botões embaixo do assunto q te ajudam na hora q vc esta escrevendo…

senão a glr evita de responder a sua pergunta…valews…

pic_mute
[color=red]public static Object selecionaPorCodigo(int key, String nome,

String chave) {

se = Sessao.getSession();

Transaction tr = se.beginTransaction();

Object obj   = null;

Query  query = se.createQuery(“select obj from " + nome

+ " as obj where obj.” + chave + " = "

+ key);

Iterator it = query.iterate();

while (it.hasNext()) {

obj = (Object) it.next();

}

se.flush();

tr.commit();

<a href="//se.close">//se.close</a>();

return obj;

}
public static Object carrega(Class cla,Integer pk){
    Object obj;
    try{
        se = Sessao.getSession();
        se.clear();
        //se.close();
        Transaction tr = se.beginTransaction();
        obj = se.load(cla,pk);
        se.flush();
        tr.commit();            
    } catch(HibernateException e){
        obj = null;
        e.printStackTrace();
    }
    return obj;
}[/color]

[color=#444444]o problema é o seguinte: se eu uso o se.close ele não carrega o objeto corretamente. Se eu nao usar ele funciona com o Objeto comum, só que usando Collection, dá o seguinte erro:[color=brown]“org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions”[/color][/color]

C

cara eu faço assim, se minha query vai retornar vários registros :

List lista = query.list();

senão, se for retornar só um registro:

Object obj = query.list.get(0);

bonfarj
<blockquote><div class="quote-author">pic_mute:</div>[color=red]public static Object selecionaPorCodigo(int key, String nome,

String chave) {

se = Sessao.getSession();

Transaction tr = se.beginTransaction();

Object obj   = null;

Query  query = se.createQuery(“select obj from " + nome

+ " as obj where obj.” + chave + " = "

+ key);

Iterator it = query.iterate();

while (it.hasNext()) {

obj = (Object) it.next();

}

se.flush();

tr.commit();

<a href="//se.close">//se.close</a>();

return obj;

}
public static Object carrega(Class cla,Integer pk){
    Object obj;
    try{
        se = Sessao.getSession();
        se.clear();
        //se.close();
        Transaction tr = se.beginTransaction();
        obj = se.load(cla,pk);
        se.flush();
        tr.commit();            
    } catch(HibernateException e){
        obj = null;
        e.printStackTrace();
    }
    return obj;
}[/color]

[color=#444444]o problema é o seguinte: se eu uso o se.close ele não carrega o objeto corretamente. Se eu nao usar ele funciona com o Objeto comum, só que usando Collection, dá o seguinte erro:[color=brown]“org.hibernate.HibernateException: Illegal attempt to associate a collection with two open sessions”[/color][/color]

Envie seu código utilizando a tag code do BB, senão fica muito complicado entender o código.

abraços!

Criado 5 de março de 2007
Ultima resposta 6 de mar. de 2007
Respostas 4
Participantes 4