Boa tarde.
Tentarei não alongar mas preciso contextualizar minha situação e entender o que ocorre.
Entrei recentemente em uma empresa onde já havia um projeto iniciado utilizando Hibernate, tenho trabalho há algum tempo e vinha notando que o fetch = FetchType.LAZY, não era respeitado, exceto quando combinado com optional = false.
Comecei a desenvolver um processo no sistema que gravava por volta de 200 registros, mas notei uma certa lentidão, como sempre notei no restante do sistema e outros processos.
Ativei o log de queries para dar uma olhada e reparei que para cada Item, eram feitas 40 consultas, lotadas de inners e left joins, apesar dos mesmos estarem Lazy.
Então pesquisando na internet encontrei sobre a propriedade:
<property name="hibernate.enable_lazy_load_no_trans" value="true"/>
Verifiquei e no projeto que eu estou trabalhando, o antigo desenvolvedor setou está propriedade.
Fiz o teste retirando a mesma e várias telas pararam de funcionar por conta das relações que não eram mais carregadas por padrão, até ai normal. Fiz o teste fazendo o JOIN FETCH do que precisava e funcionou normalmente, diminuindo drasticamente o número de queries.
A pergunta é, qual seria a boa prática para essa questão? Vejo que o enable_lazy_load_no_trans ele remove o funcionamento do Lazy, gostaria de confirmar isso é realmente uma péssima prática?
Mesmo retirando esta propriedade, os @OneToOne continuam carregando por default, mesmo com Lazy. Há alguma maneira de evitar isso? Vi algo sobre PersistentAttributeInterceptable, seria o caminho?
Obrigado desde já.