当我在Hibernate事务中执行一些查询时 - >数据在我的mysql中成功更新,但在我的应用程序中仍然存在旧值。当我重新启动 - 这是好的。如果我设置自动提交模式 - 工作正常,但我必须使用交易;-)。有任何想法吗? 在此先感谢。休眠事务问题
休眠事务问题
回答
使用UPDATE直接操作数据库不会影响会话中缓存的对象。您应该清除会话(Session.clear())。喜欢的东西:
myobj.setName(newValue)
session.saveOrUpdate(myobj)
是的我有一种感觉,这没有做,但不知道没有更多的信息:) – 2009-12-23 18:33:39
是的,我怀疑有一些根本的误解。第二级缓存可以在他不知道的情况下启用。我可以给尼古拉在这一点上的最好建议是从头到尾阅读Hibernate手册:-) – 2009-12-23 19:00:02
我整天阅读有关休眠会话/事务的内容......和神秘解决了;-)问题不在于更新方法,而是在那些返回结果。它只是构建标准,并返回“uniqueResult”,但它不在交易中。为什么我需要在这里交易?它只有一个选择查询?感谢大家的帮助! – NikolayGS 2009-12-23 23:21:16
在hibernate
无论您使用的是JPA API
或Hibernate的原生API:
session.flush()
session.clear()
query.executeUpdate()
甚至更好,你可以通过不使用更新查询和操作在内存中的对象状态避免问题您运行使用下面的接口
- 标准的任何查询(休眠的Native API)
- 查询(休眠机API)
- 的EntityManager的createQuery()(JPA)
的查询不与所述第二级或第一级高速缓存进行交互。他们直接命中数据库。如果您的查询正在更新持久化上下文中的当前实体,那些实体将不会反映这些更改。这是默认行为。
为了更新您的上下文以显示实体的最新状态,请使用Session或EntityManager中的refresh()来反映持久性上下文中的最新实体状态。 阅读下面的文档的更多信息
http://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#refresh-java.lang.Object-
否则按照惯例总在持久化上下文加载任何数据之前运行DML
。
希望这会有帮助:D
- 1. 休眠事务问题
- 2. 休眠中的事务问题
- 3. 休眠MySQL事务配置问题
- 4. 休眠事务重复问题
- 5. 休眠问题
- 6. 休眠问题
- 7. 休眠问题
- 8. 休眠问题
- 9. 休眠StalestateException问题
- 10. 休眠问题(javax.persistence.PersistenceException:org.hibernate.PersistentObjectException)
- 11. 问题在休眠
- 12. 问题在休眠
- 13. 休眠findById()问题
- 14. oracle10g休眠问题
- 15. 休眠Session.save问题
- 16. 休眠活动事务
- 17. 休眠事务边界
- 18. 休眠:saveOrUpdateAll和事务
- 19. 休眠模板事务
- 20. 休眠事务查询
- 21. JTA事务与JPA(休眠)
- 22. 休眠Spring的事务中
- 23. 事务正在休眠4.3.6
- 24. 休眠事务信息
- 25. 休眠一对多问题
- 26. 休眠“不在”问题
- 27. 休眠映射问题
- 28. 休眠模板的问题
- 29. 休眠更新问题
- 30. 休眠saveorUpdate方法问题
旧的价值在哪里?在hibernate模型对象中? – rado 2009-12-23 18:08:15
您最近如何进行更新?你在使用二级缓存吗?当你说你使用自动提交模式时,它会更新模型,但不使用事务时? – 2009-12-23 18:13:37
是的。我有两种方法 - 首先我更新表格。所有查询都无错地执行,并且transaction.commit()正在执行。当我在MySQL查询浏览器中选择 - 其确定(新值)。但是当我用第二种方法(它只加载数据库行)加载我的用户界面时,存在旧值。如果我退出程序并重新启动 - 新值(在我的UI中)? – NikolayGS 2009-12-23 18:17:33