我使用
获得实体'A'getHibernateTemplate().get(A.class, 100)
来自数据库。让我们说这个实体'A'在数据库中有一个属性'value'200。
现在,在我的Java代码中,我更改了该实体的属性。比方说,我将'value'属性更改为'500',然后将其添加到某个列表中。
现在,如果我再次对同一个实体执行getHibernateTemplate()。get(A.class,100),我将获得更新的实体(其值为500)。如何强制hibernate从数据库中获取实体,而不是我的代码中更新的实体?
这被称为“一级缓存”吗?
答案 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语句。这样,您可以准确地查看何时发生对数据库的写入。然后,您可以尝试研究/阅读的内容,并验证其是否符合预期。