Pergunta

Estou usando Spring for DI e Hibernate para acesso a dados em um banco de dados MySQL.Tenho um código dentro de uma transação que insere um registro em uma tabela e depois executa uma view que consulta essa tabela e realiza alguns cálculos agregados.O problema que vejo é que o registro que acabei de inserir durante a mesma transação não está incluído nos valores calculados da visualização.Eu executo a mesma visualização no ambiente de trabalho MySQL e o valor inserido é incluído na visualização.Alguém sabe o que está causando isso?

Foi útil?

Solução

Em última análise, tive que ligar para o EntityManager.refresh (entidade de objeto) para atualizar a entidade para o registro de exibição que eu queria atualizado.Acho que o problema reside no fato de que o Hibernate não pode reconhecer que a visão precisa ser atualizada, pois não sabe que depende (no nível do banco de dados) na entidade original que foi atualizada.Presumo que o Hibernate esteja em cache os registros da vista e não sabe que eles precisam ser atualizados, mesmo depois de um flush ().

Hibernate vê a tabela original e a vista tão completamente não relacionada, quando na realidade a vista depende da tabela e deve ser feita "suja" sempre que a tabela é alterada.Eu não sei como obter o Hibernate reconhecer isso.

Outras dicas

Provavelmente você ainda não lavou alterações no banco de dados.O Hibernate não sabe que há conexão entre a tabela que você inseriu linhas e visão que você está lendo mais tarde.Flush EntityManager (ou sessão ou modelo) antes de consultar a visualização.

Isto é provavelmente causado pelo nível de isolamento padrão do MySQL que é REPEATABLE READ.

Isso significa que sua transação no MySQL Workbench não verá alterações até que você fim essa transação.Executar um SELECT conta como uma transação.

Você deverá ver as alterações no MySQL Workbench assim que emitir um commit (ou rollback) lá.

Você provavelmente deseja alterar o nível de isolamento padrão da sua instalação para READ COMMITTED ou altere o nível de isolamento da sua sessão no MySQL Workbench para READ COMMITTED

Detalhes sobre como fazer isso podem ser encontrados no manual.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top