[RESOLVIDO] Como definir dois FetchType.EAGER na mesma entidade ? selecionar tudo de primeira

Ou seja, quero selecionar tudo de uma vez junto do primeiro select… sem duplicar os registros de preferencia =) …
Por exemplo:

@Entity

@Resource
public class Cliente {

@Id
@GeneratedValue
private Long id;
@Length(max = 50)
@PrimaryKeyJoinColumn
private String titular;
...
@OneToMany(mappedBy = "cliente", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<PlanoSaude> planoSaude;
@OneToMany(mappedBy = "cliente", cascade = CascadeType.ALL, fetch = FetchType.EAGER)
private List<Telefone> telefone;

da o seguinte erro se tento isso encima:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘criadorDeSessionFactory’: Invocation of init method failed; nested exception is org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags

Claro que desejo fazer isso, sem que os registros sejam duplicados…

Tecnologias: Vraptor - JSP - Hibernate - Mysql

Aqui mostra oq é esse erro e como resolver:
JPA: Mini Livro - Primeiros passos e conceitos detalhados

A resposta simples é: Se os 2 elementos forem Lists, não, você não pode ter 2. Na página 27 desse post do Hébert tem uma explicação bem detalhada do motivo.

Tente trocar a coleção para Set.

[quote=Hebert Coelho]Aqui mostra oq é esse erro e como resolver:
JPA: Mini Livro - Primeiros passos e conceitos detalhados[/quote]

Hebert, apliquei a solução indicada nesse link, sem precisar trocar a coleção para SET, como inclusive menciona no link que vc mandou:
http://www.guj.com.br/java/238010-hibernate–cannot-simultaneously-fetch-multiple-bags#1581352

a dica do link é essa:

[quote=apalmeira]apalmeira wrote:
Resolvi adicionando @Fetch(FetchMode.SUBSELECT) abaixo do @OneToMany(fetch = FetchType.EAGER).[/quote]

até como comentei no outro post, caiu como uma luva, muito bom o resultado aqui conforme meus testes… minha duvida agora é: Terei prejuizo na performance desse jeito? não digo pelo fato dele fazer, no meu caso, 3 seleções distintas de uma vez… mas no comportamento do hibernate em ações simples de navegação e tal, talvez tentando selecionar no banco desnecessariamente dados…


só para ficar registrado, meu código ficou assim:

@Entity 
@Resource 
public class Cliente { 

@Id 
@GeneratedValue 
private Long id; 
@Length(max = 50) 
@PrimaryKeyJoinColumn 
private String titular; 
... 
        @OneToMany(mappedBy = "cliente", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@Fetch(org.hibernate.annotations.FetchMode.SUBSELECT)
	private List<PlanoSaude> planoSaude;
	@OneToMany(mappedBy = "cliente", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
	@Fetch(org.hibernate.annotations.FetchMode.SUBSELECT)
	private List<Telefone> telefone;

[i]SIM, POR FIM DECIDI USAR LAZY INVÉS DE EAGER, E O MOTIVO TENTEI EXPLICAR ALGUNS POSTS PARA BAIXO :smiley: [/i]

Mas seu FetchType ficou como LAZY e não EAGER, o problema é se os dois forem EAGER, certo?!

Ah, e acho que não precisamos nem falar que carregar 2 listas como Eager é uma péssima ideia.

[quote=Rodrigo Sasaki]Ah, e acho que não precisamos nem falar que carregar 2 listas como Eager é uma péssima ideia.[/quote]+1

Então cara, é o seguinte:

Eu faço uma lista em JSP com alguns campos de Cliente, e apenas verifico se tem pelo menos 1 linha NAS tabelaS dependenteS (no caso a tabela planoSaude e telefone por exemplo). Se tiver, um campo na lista ganha um X senão fica em branco.
ANTESSS, eu era obrigado a colocar EAGER em apenas 1 entidade dependente, e o resultado da outra com LAZY é que o hibernate acessava o banco para cada linha da lista(por enquanto 380 vezes pois essa é minha quantidade de registros). Olhando o CONSOLE dava até medo de tantos selects gerados.

AgORAAA, com esse comando SUBSELECT, ele funciona perfeitamente com o EAGER! pode colocar quantos EAGER vc quiser, que na hora que for feito o select de CLIENTE, ele acessa as outras tabelas na mesma hora com um select a parte.
Já com o LAZY, ele vai acessar só quando for usado, porém não faz um select para cada linha da lista, mas sim apenas 1 select para tudo, o que me atende perfeitamente, pois em outras telas JSP talvez eu não precise consultar as tabelas dependentes e o LAZY fara com que elas nao sejam acessadas desnecessariamente.

Espero ter sido o mais claro possivel… perdoe alguma expressão errada, sou novato… mas to me esforçando em falar a linguagem de vcs :lol:

Mas como expliquei acima, fica melhor???
E outra, vc tem razão quanto ao SET, tinha algumas anotações erradas(devido a tentativas de tentar arrumar alguns problemas)…

Valew!