Hibernate(Fetch.LAZY)

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