Pessoal,
Estou em um paradoxo muito louco.
Tenho uma entidade que possui duas Collections que eu preciso persistir no banco…
Se eu coloco uma das listas como Lazy eu recebo um Lazy Initialization Exception.
Se eu coloco as duas listas como Eager eu recebo um Multiple Bags Exception.
Segue a classe:
package br.fiocruz.dominio;
import java.util.List;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Inheritance;
import javax.persistence.InheritanceType;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.SequenceGenerator;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.LazyCollection;
import org.hibernate.annotations.LazyCollectionOption;
@Entity
@SequenceGenerator(name="seqGrupo")
@Inheritance(strategy=InheritanceType.JOINED)
public class GrupoVisitacao {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator="seqGrupo", strategy = GenerationType.AUTO)
private Long id;
private String nomeDescritivo;
private String descricao;
private int qtdTotal;
//Se nao informar qtds abaixo será igual a metade da total;
private int qtdMasc;
private int qtdFem;
private boolean visitantesExcepcionais;
private String descricaoCasosExcepcionais;
@Enumerated
protected TipoGrupoVisitacao tipoGrupo;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "grupo_faixaEtaria")
private List<FaixaEtaria> faixaEtaria;
@ManyToOne(cascade=CascadeType.MERGE)
private ResponsavelPorGrupoVisitacao responsavel;
@ManyToOne
private InstituicaoEnsino instituicao;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "grupo_serieEscolar")
private List<SerieEscolar> serie;
[...gets e sets...]
}
Ja pesquisei abeça estou com esse problema desde a semana passada e ja fiz algumas tentativas…
1º - Anotar as listas com @Fetch(FetchMode.SUBSELECT)
Erro: Multiple bags, parece que nao surtiu nenhum efeito.
2º - Colocar as duas listas como Lazy
Erro: Lazy Inicialisation Exception
3º - Trocar as duas Listas para Set como Eager
Erro: Lazy Inicialisation Exception
4º - Trocar as duas Listas para Set como Lazy
Erro: Lazy Inicialisation Exception
Fiz outras tentativas e ja li sobre algumas gambearras tb, mas nao quero fazer remendo…
Enfim, meu problema inicial é o LazyInicializationException, a aplicação é web e eu uso o JSF… O erro esta ocorrendo antes da faze de Invoke Application, provavelmente na Restore View…
Para resolver o Lazy eu cheguei a ler sobre criar um filtro para o hibernate e colocar ele am algum lugar no jsf, eu só nao entendi muito bem como funcionaria e preferi não seguir esse raciocinio… eu gostaria que minha camada de persistencia funcionasse independente da minha camada de visao, por isso deixei essa solução de lado, nao sei se estou falando besteira… Essa solução tinha até um nome: Open session in View e ate um link rsrs https://community.jboss.org/wiki/OpenSessionInView O.O
Sobre a escolha de usar eager ou lazy eu ja refleti a respeito e acho que não vai fazer muita diferença ja que QUASE sempre que eu usar esse grupo de visitação eu terei que exibir as informações dos objetos relacionados…