Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Resolver problema de Lazy com duas listas na entidades

Como eu faria para resolver o problema de Lazy no caso tivesse duas listas na minha entidade??

2 respostas

Fala aí Thiago, blz?

Ter duas listas em uma entidade gera um problema, pois o tipo de dados lista precisa preservar a ordem. E por padrão o Hibernate só armazena a ordem para uma lista.

E se tentarmos fazer eager nas duas lista tomaremos uma exception (org.hibernate.HibernateException: cannot simultaneously fetch multiple bags).

Uma forma de fazer isso é alterando o tipo de dados de list para set. Como set não precisa preservar a ordem conseguimos fazer eager de boas. O preço que pagamos é que no set não temos atributos repetidos.

E quando falo eager tanto faz se vai ser por fetchType no relacionamento ou via query planejada (join fetch).

Outra forma é ensinar o Hibernate que ele deve preservar a ordem das duas listas. Para isso usamos a anotação @IndexColumn em cada um dos nossos atributos listas.

Com isso será criado uma nova tabela, onde será armazenado os ids dos objetos e qual a ordem deles.

Espero ter ajudado.

solução!

Opa Fernando, blz! Obrigado

Então, a recomendação de Set é valida sim, só terei um pouco mais de trabalho para pegar um elemento específico do Set, pois eu estava passando um data-attribute com o índice da lista (Spring/Thymeleaf) usando o 'List'. A Ordem dos elementos não é importante pra mim e eu poderia utilizar a implementação: LinkedHashSet para preservar a ordem de inserção se eu não estiver engado. E não devo ter objetos repetidos na lista.

Por hora utilizei a anotação @LazyCollection(LazyCollectionOption.FALSE) , Deixei a lista como EAGER por hora, mas pretendo melhorar para tirar essa dependência com implementação Hibernate, ainda tenho que testar melhor essa parte, com essa anotação resolve exception (org.hibernate.HibernateException: cannot simultaneously fetch multiple bags). Mapeamento completo:

@LazyCollection(LazyCollectionOption.FALSE)
@OneToMany(cascade = {CascadeType.ALL}, orphanRemoval=true)
@JoinColumn(name = "ID_ITEM_EQUIP_SERVICO") 
private List<ItemEquipamentoComposicao> equipamentos;

Pretendo otimizar essa parte para não ter problemas, e sua resposta foi muito válida.

Obrigado.