gpt4 book ai didi

java - Hibernate 返回 session 中的值,但不返回数据库中的值

转载 作者:行者123 更新时间:2023-11-30 08:28:54 25 4
gpt4 key购买 nike

我使用

得到实体“A”
getHibernateTemplate().get(A.class, 100) 

来自数据库。假设此实体“A”在数据库中具有属性“值”200。

现在,在我的 Java 代码中,我更改了该实体的一个属性。比方说,我将“值”属性更改为“500”,然后将其添加到某个列表中。

现在,如果我再次为同一实体执行 getHibernateTemplate().get(A.class, 100),我将获得更新后的实体(值为 500)。我如何强制 hibernate 从数据库中获取实体,而不是我的代码中更新的实体?

这就是所谓的“一级缓存”吗?

最佳答案

您的假设(关于一级缓存)是正确的。例如此处所述:Interface Session :

The main runtime interface between a Java application and Hibernate. This is the central API class abstracting the notion of a persistence service.

或此处第 2 章架构; 2.1. Overview

提取: session (org.hibernate.Session)

A single-threaded, short-lived object representing a conversation between the application and the persistent store. It wraps a JDBC connection and is a factory for Transaction. Session holds a mandatory first-level cache of persistent objects that are used when navigating the object graph or looking up objects by identifier.

此外,您还可以看到我们可用的方法,从 session 中删除对象:

  • 逐出(对象对象): 从 session 缓存中删除此实例。

  • 刷新(对象对象): 从底层数据库重新读取给定实例的状态。

  • 明确(): 完全清除 session 。

还有更多。 Evict 在这种情况下应该有效。我们必须获取当前实例 ('A') 并从 session 中显式 Evict 它。

如果我们已经加载了一些/更多的东西,但我们不知道要Evict() 做什么,我们只需要获取新的数据。然后我们可以调用 Clear() 来完全重置 session 并重新开始。

这有点激进,因为 session 中的任何对象都不会在 session Flush() 上更新/插入...但这可能是我们在这种情况下想要的 (经常用于测试...加载、清除...更改和刷新)

关于java - Hibernate 返回 session 中的值,但不返回数据库中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19867301/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com