从具有一对一关系的实体获取最新数据,并在外部更新数据

时间:2015-06-23 12:32:01

标签: java hibernate orm

我不会解释我的问题,而是试着举个例子:

假设我有一个User实体和一个Item实体。 User实体与Item具有一对一的关系。

假设我的服务器在某些时候使用sql-update查询更新了表。

我的问题是:下次我做的事情是:

Item item = user.getItem();

如何确保数据是最新的?而不是在首次查询用户实例时最初从DB读取的旧数据?

希望我的问题很明确......

谢谢!

2 个答案:

答案 0 :(得分:0)

您可以通过在DML命令后刷新实体管理器来确定更新的实体,然后再次查询该对象。

此致 人士Himanshu

答案 1 :(得分:0)

如果您在新会话中执行此操作,那么它将是最新的(如果您不对相关实体使用L2缓存)。

如果您使用L2缓存,那么它将不是最新的(如果数据在数据库中更新而没有Hibernate意识到它)。在这种情况下,如果您的用例可以在特定时间间隔内使用过时数据,则可以为UserItem实体配置过期策略,以便它们在缓存中的生命周期有限。从缓存过期后,将从数据库中获取更新的数据。

如果在后台更改数据时可以正确使受影响的二级缓存条目无效,则可以避免完全使用陈旧数据(或减少将它们用作过时的可能时间间隔)。 / p>

如果在现有会话实例中执行此操作,则ItemUser实例将位于第一级缓存中,因此您将始终获取最初提取的数据。这几乎总是理想的行为。但是,您可以手动逐出实体实例(session.evict(item); session.evict(user))或清除整个会话(session.clear())以驱逐当前会话中的所有实例,然后再从数据库中重新读取它们。