Como eu faria para resolver o problema de Lazy no caso tivesse duas listas na minha entidade??
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.