Java mysql视图未刷新事务内部(Hibernate/Spring)
我将Spring用于DI,Hibernate用于mySQL数据库上的数据访问。我在一个事务中有代码,它在一个表中插入一条记录,然后执行一个查询该表并执行一些聚合计算的视图。我看到的问题是,我刚才在同一事务中插入的记录没有包含在视图的计算值中。我在mySQL workbench中运行相同的视图,插入的值包含在视图中。有人知道这是什么原因吗?很可能您还没有刷新对数据库的更改。Hibernate不知道您插入的行和您稍后读取的视图之间存在连接。在查询视图之前刷新entitymanager(或会话或模板)。最终,我必须调用entitymanager.refresh(对象实体)来刷新我想要更新的视图记录的实体。我认为问题在于Hibernate无法识别视图需要更新,因为它不知道它(在数据库级别)依赖于更新的原始实体。我假设Hibernate正在缓存视图中的记录,并且不知道它们需要更新,即使在刷新()之后也是如此Java mysql视图未刷新事务内部(Hibernate/Spring),java,mysql,spring,hibernate,sql-view,Java,Mysql,Spring,Hibernate,Sql View,我将Spring用于DI,Hibernate用于mySQL数据库上的数据访问。我在一个事务中有代码,它在一个表中插入一条记录,然后执行一个查询该表并执行一些聚合计算的视图。我看到的问题是,我刚才在同一事务中插入的记录没有包含在视图的计算值中。我在mySQL workbench中运行相同的视图,插入的值包含在视图中。有人知道这是什么原因吗?很可能您还没有刷新对数据库的更改。Hibernate不知道您插入的行和您稍后读取的视图之间存在连接。在查询视图之前刷新entitymanager(或会话或模板)
Hibernate将原始表和视图视为完全不相关,而实际上视图依赖于表,并且在表更改时应将其设置为“脏”。我不知道如何让Hibernate认识到这一点。这很可能是由于MySQL的默认隔离级别是
可重复读取
这意味着您在MySQL Workbench中的事务在您结束该事务之前不会看到更改。运行SELECT计算为事务
一旦在MySQL Workbench中发出提交(或回滚)命令,您应该可以看到这些更改
您可能希望将安装的默认隔离级别更改为READ COMMITTED
,或者将MySQL工作台中会话的隔离级别更改为READ COMMITTED
有关如何执行此操作的详细信息,请参见手册。flush不起作用。我必须调用entityManager上的refresh方法来刷新数据库中的更改。我尝试了READ-COMMITTED,甚至READ-UNCOMMITTED,但这两种方法都没有解决问题。我想知道在从表中删除一些记录后使用会话和查询对象列表视图时如何做到这一点