Erro LazyInitializationException em propriedade EAGER (isso mesmo!)

0 respostas
ibotirama
Estou usando o JSF 2.0(Mojarra 2.0.4) + Primefaces 2.2.1 + Spring 3.0.5 + Hibernate 3.6 com este modelo abaixo dando LIE , e mesmo colocando o @Any como EAGER dá uma LazyInitializationExeception mesmo se o meu MBean for de escopo Session, eu já até coloquei o filtro OpenSessionInView do Spring e dá no mesmo. Obs: tenho uma página com um DataTable(Single selection do primefaces, list.xhtml), quando o usuário clica no registro ele seta o obj selecionado em um objeto do MBean, e ao clicar em Editar ele abre outra página(form.xhtml) para editar o registro setado, e nesta hora que dá o LIE. Poderia me ajudar ? abaixo parte do código.
@Entity
public class Pessoa implements Serializable {
    private static final long serialVersionUID = 3400394713317764808L;
 
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long codigo;
    @Column(length = 50)
    private String nome;
    private ClassePessoa classe;
    @Enumerated(EnumType.STRING)
    private TipoPessoa tipoPessoa;
    @Any(metaColumn = @Column(name = "tipo_dados"))
    @AnyMetaDef(idType = "long", metaType = "string", metaValues = {
        @MetaValue(value = "FISICA", targetEntity = DadosPessoaFisica.class),
        @MetaValue(value = "JURIDICA", targetEntity = DadosPessoaJuridica.class)})
    @JoinColumn(name = "codigo_dados")
    @Cascade(org.hibernate.annotations.CascadeType.ALL)
    private Dados dados;
-------------------------------------
public interface Dados extends Serializable{}
--------------------------------------
@Entity
public class DadosPessoaFisica implements Dados, Serializable{
    private static final long serialVersionUID = 3230268695240296033L;
 
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long codigo;
    @Column(length=20)
    private String rg;
    @Column(length=10)
    private String orgaoExpedidor;
    @Temporal(TemporalType.DATE)
    private Date dataExpedicao;
    @Column(length=14)
    private String cpf;
    @Temporal(TemporalType.DATE)
    private Date dataNascimento;
    @Enumerated(EnumType.STRING)
    private EstadoCivil estadoCivil;
    @Column(length=50)
    private String naturalidade;
    @Column(length=50)
    private String nomePai;
    @Column(length=50)
    private String nomeMae;
    @Column(length=50)
    private String localTrabalho;
    @Column(length=50)
    private String nomeConjugue;
-------------------------------------------------------
@Repository("pessoaDAO")
@Scope("singleton")
@Transactional(readOnly=true)
public class PessoaDAOImpl extends HibernateDaoSupport implements PessoaDAO {
    private static final long serialVersionUID = 8668800837955656728L;
 
    @Autowired
    public PessoaDAOImpl(SessionFactory sessionFactory) {
        setSessionFactory(sessionFactory);
    }
 
    @Override
    @Transactional(propagation=Propagation.REQUIRED, readOnly=false)
    public void store(Pessoa object) {
        try {
                getHibernateTemplate().saveOrUpdate(object);
        } catch (Exception e) {
            e.printStackTrace();
            throw new DAOServiceException("Erro ao tentar gravar : " + object + ", " + e.getMessage());
        }
    }
 
    @Override
    @Transactional(propagation=Propagation.REQUIRED, readOnly=false)
    public void remove(Pessoa object) {
        try {
            getHibernateTemplate().delete(object);
        } catch (Exception e) {
            e.printStackTrace();
            throw new DAOServiceException("Erro ao tentar apagar : " + object + ", " + e.getMessage());
        }
    }
 
    @Override
    public Pessoa findByPrimaryKey(Long pk) {
        Pessoa p;
        try {
            p = getHibernateTemplate().get(Pessoa.class, pk);
        } catch (Exception e) {
            throw new DAOServiceException(
                    "Erro ao tentar localizar " + this.getClass().getName() + " pela pk : " + pk, e);
        }
        return p;
    }
 
    @Override
    public List<Pessoa> loadAll() {
        List<Pessoa> lista = null;
        try {
              lista = (List<Pessoa>)getHibernateTemplate().loadAll(Pessoa.class);
        } catch (Exception e) {
            throw new DAOServiceException(
                    "Erro ao tentar retornar todos os registros de " + this.getClass().getName() + ".", e);
        }
 
        return lista;
    }
 
    @Override
    public Set<Pessoa> loadAll2() {
        return (Set<Pessoa>) getHibernateTemplate().loadAll(Pessoa.class);
    }
}
Criado 25 de março de 2011
Respostas 0
Participantes 1