Sei que este é um assunto muito batido aqui e fácil de resolver, então nem vou entrar com muitos detalhes, apenas com o codigo. É que entrei em noia agora e resolvi parar e pedir um help para ver se a mente melhora.
Segue abaixo os codigos para as avaliações e um local marcado como ponto de erro.
Tenho as seguintes implementações:
@Entity
class A {
@Id
public String id;
@Column
public String name
A(){}
A(String id, String name){
this.id = id;
this.name = name;
}
}
@Entity
class B {
@Id
public String id;
@OneToMany(fetch=FetchType.LAZY)
public List<A> as = new ArrayList();
public void addA(String id, String name){
as.add(new A(id, name));
}
}
class CService{
private DAO dao;
public useBeIncluaA(){
//faz um get no DAO para recuperar uma instancia de B com id=1
B b = dao.get(B.class, 1);
b.add('11', 'TesteA');
dao.save(b); // ponto de erro
}
}
O erro é o do tipo Lazy…Exception.
Alguma sugestão de como deveria ser a implementação para corrigir este problema??
Vlw
Olá AGAraujo, como vc esta trabalhando com seu objeto “B” destacado da sessão vc teria que alterar o “LAZY” para “EAGER” no seu mapeamento ou então fazer a adição de “A” com a sessão aberta. Seria mais ou menos essa a ideia.
[]'s
Boa Tiago!
Cara com EAGER funciona sim, tanto que deixei assim para dar continuidade ao projeto porém estou com este pepino para resolver…
Sobre adicionar A com a sessão aberta voce quis dizer abrir a sessão de forma declarada e encerrar ao final do procedimento?
//abrir a sessão aqui
B b = dao.get(B.class, 1);
b.add('11', 'TesteA');
dao.save(b);
//fechar a sessão aqui
Seria isto?
Se for não é uma solução viável para o meu caso.
Há outras sugestões?
Sobre a sessão aberta é isso sim, mas esta é so a ideia, pra ajudar mais precisaria ver como vc implementou o seu dao, e como vc esta fazendo a persistencia.
[]'s
Meu DAO é uma extensão de HibernateDAOSupport (do Spring) realizando operações CRUD normalmente.
A abertura e o fechamento da sessão é transparente para as outras camadas (realizado pelo proprio Spring).
Não me lembro ao certo mas o hibernate tem um metodo que inicializa qualquer coleção de um dado objeto, algo como “hibernate.initialize()” da uma pesquisada que vc deve encontrar, agora se sua sessão é gerenciada pelo container vc não deveria ter problemas com lazy, ou ao menos acho q não, e eu não conheço o Spring para ter uma ideia de como resolver isso.
[]'s