2012-03-12 55 views
3

我正在使用Spring的DI和Hibernate在mySQL数据库上进行数据访问。我有一个事务中的代码,它在表中插入一条记录,然后执行一个视图来查询该表并执行一些聚合计算。我看到的问题是,我刚刚在同一事务中插入的记录未包含在视图的计算值中。我在mySQL工作台中运行相同的视图,插入的值包含在视图中。有谁知道这是什么原因造成的?mysql视图不在事务内部刷新(休眠/弹出)

回答

5

最终,我不得不调用entityManager.refresh(Object entity)刷新我想要更新的视图记录的实体。我认为问题在于,Hibernate无法识别视图需要更新,因为它不知道它是依赖于(在数据库级别)更新的原始实体。我认为Hibernate会缓存视图中的记录,并且不知道它们需要更新,即使在flush()之后。

Hibernate将原始表和视图视为完全不相关,实际上视图依赖于表,并且每当表更改时应该使其变得“脏”。我不知道如何让Hibernate认识到这一点。

+0

我想知道在从表 – 2015-02-03 16:49:26

2

很可能你还没有更改数据库的更改。 Hibernate不知道你插入行的表与你以后正在阅读的视图之间是否存在关联。在查询视图之前刷新实体管理器(或会话或模板)。

+0

刷新不起作用。我不得不调用entityManager上的刷新方法来刷新数据库中的更改。 – 2012-03-13 13:57:43

+0

我不知道这是否是缓存问题。 – 2012-03-13 13:58:14

1

这很可能是由于MySQL的默认隔离级别为REPEATABLE READ造成的。

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

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

你可能想为您的安装或者更改默认的隔离级别READ COMMITTED或更改MySQL工作台会话的隔离级别设置为READ COMMITTED

细节你如何做,可以在手册中找到。

+1

中删除一些记录后,如何使用会话和查询对象列表来查看这个问题,尝试了READ-COMMITTED甚至READ-UNCOMMITTED,但都没有解决问题。 – 2012-04-04 20:42:43