Pregunta

Estoy usando Spring para DI e Hibernate para acceder a datos en una base de datos MySQL.Tengo un código dentro de una transacción que inserta un registro en una tabla y luego ejecuta una vista que consulta esa tabla y realiza algunos cálculos agregados.El problema que veo es que el registro que acabo de insertar durante la misma transacción no está incluido en los valores calculados de la vista.Ejecuto la misma vista en MySQL Workbench y el valor insertado se incluye en la vista.¿Alguien sabe qué está causando esto?

¿Fue útil?

Solución

En última instancia, tuve que llamar a EntityManager.Refresh (entidad de objeto) para actualizar la entidad para el registro de la vista que quería actualizar.Creo que el problema reside en el hecho de que Hibernate no puede reconocer que la vista debe actualizarse, ya que no sabe que depende (a nivel de base de datos) en la entidad original que se actualizó.Supongo que Hibernate está almacenando en almacenamiento en caché los registros de la vista y no sabe que deben actualizarse, incluso después de un rubor ().

Hibernate ve la tabla original y la vista como completamente no relacionada, cuando en realidad la vista depende de la tabla y debe hacerse "sucia" cuando la mesa cambie.No sé cómo hacer hibernar para reconocer eso.

Otros consejos

Probablemente aún no ha eliminado los cambios en la base de datos todavía.Hibernate no sabe que hay conexión entre la Tabla que inserte las filas y la vista que está leyendo más tarde.Flush EntityManager (o sesión o plantilla) antes de consultar la vista.

Lo más probable es que esto se deba al nivel de aislamiento predeterminado de MySQL, que es REPEATABLE READ.

Esto significa que su transacción en MySQL Workbench no verá cambios hasta que fin esa transacción.Ejecutar un SELECT cuenta como una transacción.

Debería ver los cambios en MySQL Workbench una vez que emita una confirmación (o reversión) allí.

Probablemente desee cambiar el nivel de aislamiento predeterminado de su instalación a READ COMMITTED o cambie el nivel de aislamiento de su sesión en MySQL Workbench a READ COMMITTED

Los detalles sobre cómo hacerlo se pueden encontrar en el manual.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top