Olá. tenho um sistema legado, que usa hibernate puro com mapeamento via arquivos "xxx.hbm.xml".
Ocorre que para poucos registros, tudo funcionava muito bem.
Até que ocorreu um determinado momento em que aumentou a quantidade de registros que a gente precisou tratar e os problemas de performance apareceram ao executar um determinado metodo X, q retorna uma lista de um VO e praticamente soh tem consultas. O momento de salvar no banco é feito em outro metodo que recebe essa lista.
No caso, nesse arquivo xml de mapeamento existem mapeamentos com 4 outras classes. Deu para ver nos logs q ao chamar o metodo X, dentro desse metodo é chamado o metodo '.uniqueResult()' q disparou uma query e ao chamar 'findByPK()' disparou outras 3 queries.
Diante desse problema de desempenho, percebi q no metodo X, apenas um ID era necessário e resolvi trocar na DAO por uma query nativa, o que fez reduzir pela metade o tempo de execução do metodo X, mas causou o erro abaixo ao chamar o metodo para salvar/update no banco de dados: " Caused by: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: "
Apenas modifiquei na DAO: ao inves de devolver uma instancia de classe Pessoa, devolvi o ID dessa Pessoa (via query nativa) e setei o ID na instancia Pessoa e tudo funcionou certinho, até o erro acima.
Então, estou com algumas duvidas q vou testar durante a semana:
- consigo saber em que estado do ciclo de vida a minha instancia estava em determinado momento, tipo "session.getState(instancia)"?
- pq deu esse erro? será q se eu devolver um investidor ao invés de um Long do ID resolve?
- é possível modificar do jeito q modifiquei p uma query nativa e ainda assim funcionar o save/update?
Caso tenha alguma referencia para eu poder ler sobre uma possivel solução, agradeço.
Obrigado.