我使用 Spring for DI 和 Hibernate 对 mySQL 数据库进行数据访问。我在事务中有代码,它在表中插入一条记录,然后执行一个查询该表并执行一些聚合计算的视图。我看到的问题是我刚刚在同一事务中插入的记录未包含在视图的计算值中。我在 mySQL 工作台中运行相同的视图,并且插入的值包含在视图中。有谁知道是什么原因造成的?
3 回答
最终,我不得不调用 entityManager.refresh(Object entity) 来刷新我想要更新的视图记录的实体。我认为问题在于 Hibernate 无法识别视图需要更新,因为它不知道它(在数据库级别)依赖于更新的原始实体。我认为 Hibernate 正在缓存视图中的记录,并且不知道它们需要更新,即使在 flush() 之后也是如此。
Hibernate 认为原始表和视图完全不相关,而实际上视图依赖于表,并且在表更改时应该将其设置为“脏”。我不知道如何让 Hibernate 认识到这一点。
很可能您还没有刷新对数据库的更改。Hibernate 不知道您插入行的表和您稍后正在阅读的视图之间存在连接。在查询视图之前刷新实体管理器(或会话或模板)。
这很可能是由 MySQL 的默认隔离级别REPEATABLE READ.
这意味着在您结束该事务之前,您在 MySQL Workbench 中的事务不会看到更改。运行 SELECT 算作一个事务。
一旦您在 MySQL Workbench 中发出提交(或回滚),您应该会在其中看到更改。
您可能希望将安装的默认隔离级别READ COMMITTED更改为或将 MySQL Workbench 中会话的隔离级别更改为READ COMMITTED
有关如何执行此操作的详细信息,请参阅手册。