我使用Spring for DI和Hibernate在mySQL数据库上进行数据访问。我在事务中有代码,它在表中插入一条记录,然后执行一个视图,该视图查询该表并执行一些聚合计算。我看到的问题是,我刚刚在同一事务期间插入的记录没有包括在视图的计算值中。我在mySQL工作台中运行相同的视图,插入的值包含在视图中。有人知道这是什么原因吗?
发布于 2012-03-13 22:54:08
最终,我不得不调用entityManager.refresh(对象实体)来刷新我想要更新的视图记录的实体。我认为问题存在于Hibernate无法识别视图需要更新的事实,因为它不知道它(在数据库级别)依赖于被更新的原始实体。我假设Hibernate正在缓存视图中的记录,即使在flush()之后也不知道它们是否需要更新。
Hibernate将原始表和视图视为完全不相关的,而实际上视图依赖于表,并且只要表发生更改,就应该使其“脏”。我不知道如何让Hibernate识别这一点。
发布于 2012-03-13 12:55:31
最有可能的是,您还没有将更改刷新到数据库。Hibernate不知道您插入的行和稍后要读取的视图之间是否存在连接。在查询视图之前刷新entitymanager (或会话或模板)。
发布于 2012-03-13 23:29:54
这很可能是由MySQL的默认隔离级别REPEATABLE READ引起的。
这意味着您在MySQL工作台中的事务在您结束该事务之前不会看到更改。运行SELECT算作事务。
在MySQL工作台中发出提交(或回滚)命令后,您应该会看到这些更改。
您可能希望将安装的默认隔离级别更改为READ COMMITTED,或者将MySQL工作台中会话的隔离级别更改为READ COMMITTED
关于如何做到这一点的详细信息可以在手册中找到。
https://stackoverflow.com/questions/9676121
复制相似问题