Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate在会话中返回值,但不从数据库返回_Java_Hibernate_Session_Nhibernate_Jdbc - Fatal编程技术网

Java Hibernate在会话中返回值,但不从数据库返回

Java Hibernate在会话中返回值,但不从数据库返回,java,hibernate,session,nhibernate,jdbc,Java,Hibernate,Session,Nhibernate,Jdbc,我使用 getHibernateTemplate().get(A.class, 100) 从数据库中。假设此实体“A”在数据库中具有属性“value”200 现在,在我的Java代码中,我更改了这个实体的一个属性。比方说,我将“value”属性更改为“500”,然后将其添加到某个列表中 现在,如果我再次对同一个实体执行getHibernateTemplate().get(A.class,100),我将得到更新的实体(其值为500)。如何强制hibernate从数据库中获取实体,而不是在代码中

我使用

getHibernateTemplate().get(A.class, 100) 
从数据库中。假设此实体“A”在数据库中具有属性“value”200

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

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


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

我建议在谷歌上搜索hibernate提交、刷新和分离,并在它们写入数据库时读取。更好的是,如果你还没有读过关于Hibernate的好书,我建议你读一本关于Hibernate的好书(在amazon.com上搜索好书的评论),以便更好地掌握这项技术

我回复这篇文章的原因不是直接回答您的问题,而是建议您编辑hibernate.cfg.xml文件,并将以下内容设置为true: false。 这将导致控制台窗口显示发送到数据库的每个sql语句。通过这种方式,您可以准确地看到写入数据库的时间。然后,您可以对所研究/阅读的内容进行实验,并验证它是否如您所期望的那样工作。

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

Java应用程序和Hibernate之间的主运行时接口。 这是抽象持久性服务概念的中心API类

或者这里是第二章。建筑

摘录:会话(org.hibernate.Session)

表示应用程序和持久存储之间对话的单线程、短期对象。它包装了一个JDBC 连接,是事务处理的工厂。会议必须举行一次会议 导航时使用的持久对象的一级缓存 对象图或按标识符查找对象

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

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

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

  • 清除(): 完全清除会话
还有更多<代码>收回在这种情况下应该可以工作。我们必须获取当前实例('A'),并明确地将其从会话中移出

如果我们已经加载了一些/更多的内容,但我们不知道要退出什么(),我们只需要获取新的数据。然后我们可以调用
Clear()
完全重置会话并重新启动


这有点激进,因为会话中的任何对象都不会在会话
Flush()
上更新/插入。。。但它可能是我们在这个场景中想要的(通常用于测试…加载、清除…更改和刷新)

是的,这是一级缓存。您应该在修改之前分离旧实体或关闭连接/事务。如何分离旧实体?