Como eu faria para resolver o problema de Lazy no caso tivesse duas listas na minha entidade??
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Como eu faria para resolver o problema de Lazy no caso tivesse duas listas na minha entidade??
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.
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.