2012-07-08 48 views
0

我正在使用hibernate,spring,jpa。 在工作流程中,我更新了一个实体;但是这些更新在另一个工作流程中不可用。当我重新启动服务器时,它工作正常。如何从Hibernate缓存中删除实体

有没有办法让我更新一个实体;我要求hibernate将它从它所拥有的任何缓存中删除。因此,当任何其他工作流程需要该对象时,会创建一个新的查询?

+0

http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/performance.html#performance-sessioncache 它有帮助吗? – doniyor 2012-07-08 07:42:21

+0

或此:http://stackoverflow.com/questions/474159/hibernate-second-level-cache-with-spring – doniyor 2012-07-08 07:45:01

+1

我没有使用二级缓存。另外,第一个注释是关于evict方法的,它在JPA的Hibernate的EntityManager中是不可用的。 evict()适用于传统的休眠。 – Deepak 2012-07-08 07:51:41

回答

2

这听起来像你有两个单独的会话为同一个应用程序,因此,有两个1级缓存。第一级缓存是Hibernate在会话上下文中使用的缓存。所以,如果你没有关闭/清除你的会话,这将会持续增长,可能与其他第一级缓存(在其他线程或其他虚拟机中)发生冲突。很难说如果是这样的话,因为你没有指定你的环境,但你不能改变另一个会话的第一级缓存。

避免这种情况的最佳解决方案是使用受管理的EntityManager(来自您的应用程序服务器)来处理实体。这就是服务器的角色来处理这种情况。但是,您似乎正在采取“春季方式”,因此,您必须手动执行此操作:在使用它之后清除会话,或在读取/更新数据之前进行刷新。然后,您需要某种锁定(悲观/乐观),不会丢失可能已从其他线程更改的信息。

相关问题