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);
}
}