我使用 Spring 进行 DI 并使用 Hibernate 进行 mySQL 数据库上的数据访问。我在事务内有代码,该代码在表中插入记录,然后执行查询该表并执行一些聚合计算的视图。我看到的问题是我刚刚在同一事务期间插入的记录不包含在视图的计算值中。我在 mySQL 工作台中运行相同的视图,插入的值包含在视图中。有谁知道是什么原因造成的?

有帮助吗?

解决方案

最终,我不得不调用EntityManager.refresh(对象实体)来刷新我想要更新的视图记录的实体。我认为这个问题驻留在休眠无法识别出需要更新视图的事实中,因为它不知道它在更新的原始实体上依赖于(数据库级别)。我认为Hibernate正在缓存从视图中的记录,并不知道甚至在刷新()之后也需要更新。

hibernate将原始表和视图视为完全无关,当实际上,视图取决于表格,只要表更改,应在“脏”。我不知道如何让Hibernate认识到这一点。

其他提示

最可能您还没有将更改刷新到数据库。Hibernate不知道表之间存在连接之间的连接,并查看您正在阅读的行和视图。在查询视图之前刷新EntityManager(或会话或模板)。

这很可能是由 MySQL 的默认隔离级别引起的 REPEATABLE READ.

这意味着您在 MySQL Workbench 中的事务不会看到更改,直到您 结尾 该交易。运行 SELECT 算作一个事务。

一旦您在 MySQL Workbench 中发出提交(或回滚),您应该会看到其中的更改。

您可能想要将安装的默认隔离级别更改为 READ COMMITTED 或者将 MySQL Workbench 中的会话隔离级别更改为 READ COMMITTED

有关如何操作的详细信息可以在手册中找到。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top