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

时间:2013-11-08 19:42:45

标签: java hibernate session nhibernate jdbc

我使用

获得实体'A'
getHibernateTemplate().get(A.class, 100) 

来自数据库。让我们说这个实体'A'在数据库中有一个属性'value'200。

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

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

这被称为“一级缓存”吗?

2 个答案:

答案 0 :(得分:3)

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

  

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

或者第2章。架构; 2.1. Overview

Extract:Session(org.hibernate.Session)

  

单线程,短期对象,表示应用程序与持久性存储之间的对话。它包装了一个JDBC   连接并且是Transaction的工厂。会话持有强制性   导航时使用的持久对象的第一级缓存   对象图或按标识符查找对象。

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

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

  • refresh(Object object):       从底层数据库重新读取给定实例的状态。

  • 明确():       完全清除会话。

还有更多。在这种情况下Evict应该正常工作。我们必须从会话中获取当前实例('A')并明确Evict它。

如果我们已经加载了一些/更多内容,而我们不知道,Evict()是什么,我们只需要获取新数据。然后我们可以调用Clear()来完全重置会话并重新开始。

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

答案 1 :(得分:0)

我建议在Google写入数据库时​​搜索Google的hibernate提交,刷新,分离和读取。更好的是,我建议您阅读一本关于Hibernate的好书,如果您还没有这样做(搜索amazon.com以获得对书籍的好评),以便掌握该技术。

我回复此帖的原因不是直接回答您的问题,而是建议您编辑hibernate.cfg.xml文件并将以下内容设置为true:   < property name =“hibernate.show_sql”>假< / property>。 这将导致显示到控制台窗口以列出发送到数据库的每个sql语句。这样,您可以准确地查看何时发生对数据库的写入。然后,您可以尝试研究/阅读的内容,并验证其是否符合预期。