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