我不会解释我的问题,而是试着举个例子:
假设我有一个User
实体和一个Item
实体。 User
实体与Item
具有一对一的关系。
假设我的服务器在某些时候使用sql-update查询更新了表。
我的问题是:下次我做的事情是:
Item item = user.getItem();
如何确保数据是最新的?而不是在首次查询用户实例时最初从DB读取的旧数据?
希望我的问题很明确......
谢谢!
答案 0 :(得分:0)
您可以通过在DML命令后刷新实体管理器来确定更新的实体,然后再次查询该对象。
此致 人士Himanshu
答案 1 :(得分:0)
如果您在新会话中执行此操作,那么它将是最新的(如果您不对相关实体使用L2缓存)。
如果您使用L2缓存,那么它将不是最新的(如果数据在数据库中更新而没有Hibernate意识到它)。在这种情况下,如果您的用例可以在特定时间间隔内使用过时数据,则可以为User
和Item
实体配置过期策略,以便它们在缓存中的生命周期有限。从缓存过期后,将从数据库中获取更新的数据。
如果在后台更改数据时可以正确使受影响的二级缓存条目无效,则可以避免完全使用陈旧数据(或减少将它们用作过时的可能时间间隔)。 / p>
如果在现有会话实例中执行此操作,则Item
和User
实例将位于第一级缓存中,因此您将始终获取最初提取的数据。这几乎总是理想的行为。但是,您可以手动逐出实体实例(session.evict(item); session.evict(user)
)或清除整个会话(session.clear()
)以驱逐当前会话中的所有实例,然后再从数据库中重新读取它们。