2009-12-23 109 views
0

当我在Hibernate事务中执行一些查询时 - >数据在我的mysql中成功更新,但在我的应用程序中仍然存在旧值。当我重新启动 - 这是好的。如果我设置自动提交模式 - 工作正常,但我必须使用交易;-)。有任何想法吗? 在此先感谢。休眠事务问题

+0

旧的价值在哪里?在hibernate模型对象中? – rado 2009-12-23 18:08:15

+0

您最近如何进行更新?你在使用二级缓存吗?当你说你使用自动提交模式时,它会更新模型,但不使用事务时? – 2009-12-23 18:13:37

+0

是的。我有两种方法 - 首先我更新表格。所有查询都无错地执行,并且transaction.commit()正在执行。当我在MySQL查询浏览器中选择 - 其确定(新值)。但是当我用第二种方法(它只加载数据库行)加载我的用户界面时,存在旧值。如果我退出程序并重新启动 - 新值(在我的UI中)? – NikolayGS 2009-12-23 18:17:33

回答

1

使用UPDATE直接操作数据库不会影响会话中缓存的对象。您应该清除会话(Session.clear())。喜欢的东西:

myobj.setName(newValue) 
session.saveOrUpdate(myobj)  
+0

是的我有一种感觉,这没有做,但不知道没有更多的信息:) – 2009-12-23 18:33:39

+0

是的,我怀疑有一些根本的误解。第二级缓存可以在他不知道的情况下启用。我可以给尼古拉在这一点上的最好建议是从头到尾阅读Hibernate手册:-) – 2009-12-23 19:00:02

+0

我整天阅读有关休眠会话/事务的内容......和神秘解决了;-)问题不在于更新方法,而是在那些返回结果。它只是构建标准,并返回“uniqueResult”,但它不在交易中。为什么我需要在这里交易?它只有一个选择查询?感谢大家的帮助! – NikolayGS 2009-12-23 23:21:16

0

hibernate无论您使用的是JPA API或Hibernate的原生API:

session.flush() 
session.clear() 
query.executeUpdate() 

甚至更​​好,你可以通过不使用更新查询和操作在内存中的对象状态避免问题您运行使用下面的接口

  1. 标准的任何查询(休眠的Native API)
  2. 查询(休眠机API)
  3. 的EntityManager的createQuery()(JPA)

的查询不与所述第二级或第一级高速缓存进行交互。他们直接命中数据库。如果您的查询正在更新持久化上下文中的当前实体,那些实体将不会反映这些更改。这是默认行为。

为了更新您的上下文以显示实体的最新状态,请使用Session或EntityManager中的refresh()来反映持久性上下文中的最新实体状态。 阅读下面的文档的更多信息

http://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#refresh-java.lang.Object-

https://docs.jboss.org/hibernate/orm/3.5/javadocs/org/hibernate/Session.html#refresh%28java.lang.Object%29

否则按照惯例总在持久化上下文加载任何数据之前运行DML

希望这会有帮助:D