ERRO. org.hibernate.LazyInitializationException: could not initialize proxy - no Session

1 resposta
K

Estou tentando realizar uma consulta a partir de um id, mas estou recebendo esse erro.

Classe Cliente.java
@Entity
@Table(name="Cliente", schema="Tecnicos")
public class Cliente implements Serializable {

    @Id
    @SequenceGenerator(name="SEQ_CLI", sequenceName="SEQ_CLIENTE", allocationSize=1)
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_CLI")
    @Column(name="cli_id", nullable=false)
    private Integer Id;

    @Column(name="cli_codext")
    private Integer codigoExterno;

    @Column(name="cli_fili")
    private Integer filial;

    @Column(name="cli_razaosocial", length=80)
    private String razaoSocial;

    @Column(name="cli_nomefantasia", length=80)
    private String nomeFantasia;

    @Column(name="cli_cnpj", length=20)
    private String cnpj;

    @Column(name="cli_inscest", length=30)
    private String InscEst;

    @Column(name="cli_endereco", length=200)
    private String endereco;

    @Column(name="cli_bairro", length=45)
    private String bairro;

    @Column(name="cli_cidade", length=50)
    private String cidade;

    @Column(name="cli_estado", length=2)
    private String estado;

    @Column(name="cli_cep", length=20)
    private String cep;

    @Column(name="cli_telefone", length=20)
    private String telefone;

    @Column(name="cli_situreg", length=20)
    private String situ_reg;

    @OneToMany(mappedBy="cliente", fetch=FetchType.LAZY)
    @Cascade(CascadeType.ALL)
    private Collection<EmailCliente> email;

    @ManyToMany(fetch=FetchType.EAGER)
    @JoinTable(name="tecnico_cliente", schema="Tecnicos",
            joinColumns=@JoinColumn(name="teccli_cli_id"),
            inverseJoinColumns=@JoinColumn(name="teccli_tec_id"))
    private Collection<Tecnicos> tecnicos;

    @ManyToMany(fetch=FetchType.LAZY)
    @JoinTable(name="questionario_cliente", schema="Tecnicos",
            joinColumns=@JoinColumn(name="cli_id"),
            inverseJoinColumns=@JoinColumn(name="ques_id"))
    private Collection<Questionario> questionarios;
DAO
public class GenericDAO<T> implements DAO<T>{
 
    private Session session = HibernateUtil.getSessionFactory().openSession();
    private Transaction tx;
    private Class<T> classe;

    public GenericDAO(Class<T> classe){
        this.classe = classe;
    }
  
    @Override
    public void insert(T classe) {
        try{
            tx = session.beginTransaction();
            session.save(classe);
            tx.commit();
        }
        catch(HibernateException ex){
            tx.rollback();
            throw ex;
        }
        finally{
            session.close();
        }
    }

    @Override
    public void update(T classe) {
        try{
            tx = session.beginTransaction();
            session.update(classe);
            tx.commit();
        }
        catch(HibernateException ex){
            tx.rollback();
            throw ex;
        }finally{
            session.close();
        }
    }

    @Override
    public void delete(T classe) {
        try{
            tx = session.beginTransaction();
            session.update(classe);
            tx.commit();
        }
        catch(HibernateException ex){
            tx.rollback();
            throw ex;
        }finally{
            session.close();
        }
    }

    @Override
    public List<T> findAll() {
        try{
            Criteria c = session.createCriteria(this.classe);
            return c.list();
        }
        catch(HibernateException ex){
            tx.rollback();
            throw ex;            
        }finally{
            session.close();
        }
    }

    public List<T> findByName(Object coluna ,Object d) {
        try{
            Criteria c = session.createCriteria(this.classe);
            c.add(Restrictions.ilike(coluna.toString(), "%"+d.toString()+"%"));
            c.addOrder(Order.asc(coluna.toString()));
            return c.list();
        }
        catch(HibernateException ex){
            throw ex;
        }
        finally{
            session.close();
        }
    }

    public T findByID(Integer id) throws HibernateException {
         try{
            return (T) session.load(this.classe, id);
        }
        catch(HibernateException ex){
            throw ex;
        }finally{
            session.close();
        }
    }

    public void saveOrUpdate(T clazz) throws HibernateException {
        try{
            tx = session.beginTransaction();
            session.saveOrUpdate(clazz);
            tx.commit();
        }
        catch(HibernateException ex){
            tx.rollback();
            throw ex;
        }finally{
            session.close();
        }
    }
}

Evento para recuperar o cliente

class ListenerAbas implements ChangeListener{

        public void stateChanged(ChangeEvent e) {
            Integer id = Integer.parseInt(tabela.getValueAt(linha, 0).toString());
            GenericDAO<Cliente> dao = new GenericDAO<Cliente>(Cliente.class);
            if(abas.getSelectedIndex() == 1){
                try{
                    Cliente cli = dao.findByID(id);
                    
                    codExt.setText(cli.getCodigoExterno().toString());
                    razaoSocial.setText(cli.getRazaoSocial());
                    nomeFantasia.setText(cli.getNomeFantasia());
                    cnpj.setText(cli.getCnpj());
                    inscEst.setText(cli.getInscEst());
                    filial.setText(cli.getFilial().toString());
                    endereco.setText(cli.getEndereco());
                    bairro.setText(cli.getBairro());
                    cidade.setText(cli.getCidade());
                    cep.setText(cli.getCep());
                    estado.setText(cli.getEstado());
                    telefone.setText(cli.getTelefone());

                }
                catch(HibernateException ex){
                    JOptionPane.showMessageDialog(null, ex);
                    ex.printStackTrace();
                }
            }
        }
    }

1 Resposta

M

Você tem que chamar os getters antes de fechar a sessão(antes do commit), mesmo que você não faça nada com eles, para que a aplicação ainda tenha acesso ao banco.

Criado 14 de fevereiro de 2011
Ultima resposta 6 de set. de 2011
Respostas 1
Participantes 2