我不会解释我的问题,而是试着举一个例子:
假设我有一个User实体和一个Item实体。User实体与Item具有一对一的关系。
假设在某个时刻,我的服务器使用sql-update查询更新表。
我的问题是:下一次我会这样做:
Item item = user.getItem();如何确保数据是最新的?而不是第一次查询用户实例时从数据库中读取的旧数据?
希望我的问题清楚了..。
谢谢!
发布于 2015-06-23 20:52:55
通过在DML命令后刷新实体管理器,然后再次查询对象,可以确定已更新的实体。
问候喜满树
发布于 2015-06-23 21:34:29
如果你在新的会话中这样做,那么它将是最新的(如果你没有对有问题的实体使用L2缓存)。
如果您使用L2缓存,那么它将不是最新的(如果数据在数据库中被更新,而Hibernate不知道)。在这种情况下,如果您的用例可以在特定时间间隔内使用过期数据,您可以为User和Item实体配置过期策略,从而限制它们在缓存中的生命周期。在它们从缓存中过期后,将从数据库中提取更新的数据。
如果您可以在后台更改数据时正确地使受影响的二级缓存条目无效,则可以避免完全使用陈旧数据(或减少将它们用作陈旧数据的可能时间间隔)。
如果您在现有的会话实例中执行此操作,则Item和User实例都将位于一级缓存中,因此您将始终获取最初获取的数据。这几乎总是我们想要的行为。但是,您可以手动逐出实体实例(session.evict(item); session.evict(user))或清除整个会话(session.clear()),以逐出当前会话中的所有实例,然后从数据库中重新读取它们。
https://stackoverflow.com/questions/31002912
复制相似问题