Olá, eu uso no meu sistema o Hibernate JPA 2 e o Postgres.
Tenho uma entidade na minha aplicação que possui muitas colunas. É uma entidade que fica salvo as baixas pagamentos da empresa.
Essa entidade tem muitas colunas que são @ManyToOne, e como sabemos as colunas *ToOne são carregadas de forma EAGER por padrão.
Conforme o crescimento da entidade me deparei com o seguinte erro "target lists can have at most 1664 entries". Que diz que o select criado possui mais de 1664 colunas.
Exibi a consulta do Hibernate, e percebi que o mesmo criava uma consulta enorme, pois cada ToOne que encontrava ele inicializava, e dentro da entidade inicializada o hibernate inicializava cada ToOne dentro dessa outra entidade, sendo assim, por ter muitos campos *ToOne com muitas dependências o erro ocorria.
Eu resolvi o problema colocando alguns campos *ToOne da entidade para fetch Lazy.
Pergunta 1: Gostaria de saber se essa é a forma ideal para resolver o problema, ou se existe alguma outra solução mais adequada?
Encontrei em alguns fóruns essa solução (que para mim não funcionou) que deveria ser posto no persistence.xml, que segundo o que eu li, define quantas collections deverão ser carregadas juntando todos aqueles SELECTS em uma clausula “IN”.
Pergunta 2: Gostaria de saber se deixar isso no código é uma boa prática, ou se isso pode deixar o sistema mais lento? Se alguem souber mais detalhes sobre isso.
Também li a respeito de trabalhar com listas OneToMany com @Fetch(FetchMode.SUBSELECT), no entanto não entendi no que isso ajudaria no sistema, Pergunta 3: Alguém que entender sobre isso pode me explicar se isso é uma boa prática trabalhar com Fetch SUBSELECT e em quais momentos devo utilizar?