最近的一个项目, 在更改数据库之后,再次查询,发现返回值总是在变化,有时候和数据库一致,有时候却仿佛回滚到了原来的状态。 这个问题是查询的时候,使用了以前的Session缓存。 虽然在数据更改之后,Hibernate会更新缓存,但是以前的session没有在finally关掉,所以缓存存在周期超过了一个transaction; 同时,又没有设置查询不使用缓存,所以造成了这个问题。
这个问题应该非常的常见,因为使用的代码是Hibernate生成的。 修复的办法是修改Hibernate生成的代码,设置Session不使用缓存(session.setCacheable ),然后在finally里面关掉Session.close(),并且每次都把Session清空(这个是在HibernateSessionFactory里面的getSession里面,加上Session.clear())。三管齐下,不过这是专门用来解决需要每次查询都更新的情况。 具体的对缓存的管理,大家还是按照项目的需求具体设置吧。
首先,遗弃原始的getSession() 方法, 使用新版的getClearSession() 方法。
public static Session getClearSession() throws HibernateException {
Session session = (Session) threadLocal.get();
if (session == null || !session.isOpen()) {
if (sessionFactory == null) {
rebuildSessionFactory();
}
session = (sessionFactory != null) ? sessionFactory.openSession()
: null;
threadLocal.set(session);
}
session.clear();
return session;
}
然后在需要的地方调用新方法,并设置关闭缓存
public List findRefreshAll() {
log.debug("finding all TkTimeEntry instances");
try {
String queryString = "from TkTimeEntry";
Query queryObject = getClearSession().createQuery(queryString);
queryObject.setCacheable(false);
return queryObject.list();
}
catch (RuntimeException re) {
log.error("find all failed", re);
throw re;
}
}
最后,在transaction使用session的时候,关闭session.
public List<tktimeentry> RetrieveAllTimeEntry() {<br> TkTimeEntryDAO dao = new TkTimeEntryDAO();<br> Transaction trans = null;<br> try {<br> trans = dao.getSession().beginTransaction();<br> List<tktimeentry> timeEntryList = dao.findRefreshAll();<br> trans.commit();<br> return timeEntryList;<br><br> }<br> catch (HibernateException e) {<br> if (trans != null)<br> trans.rollback();<br> log.fatal(e);<br> return null;<br> }<br> finally<br> {<br> dao.getSession().close();<br> }<br> }</tktimeentry></tktimeentry>
分享到:
相关推荐
Hibernate作为一种现代的、备受瞩目的数据库访问技术,其核心价值在于提供了一种高效且优雅的数据持久层解决方案。在企业级应用中,直接使用JDBC进行数据库访问不仅复杂且耗时,这促使开发者寻找更为简便的方法。...
在这个过程中,开发者可能遇到过时的方法问题,例如`buildSessionFactory()`,但在提供的代码中找到了替代解决方案。 首先,Myeclipse 10.0是Eclipse的一个增强版本,它为Java开发提供了更多的功能,如内置服务器...
在使用MyEclipse进行开发时,可能会遇到配置Hibernate框架出现问题的情况。本文将针对“MyEclipse配置Hibernate时出错”的问题进行全面解析,旨在帮助开发者更好地理解并解决此类问题。 ### 一、MyEclipse简介 ...
通常,我们会在Action类中创建Hibernate的Session对象,执行查询或更新操作,然后将结果传递给视图层展示。同时,需要在Struts的配置文件中添加Hibernate的SessionFactory引用,确保二者能协同工作。 5. **...
Spring框架则是一个全面的后端解决方案,涵盖了依赖注入(DI)、面向切面编程(AOP)、事务管理、数据访问等众多功能。Spring的IoC容器管理着应用对象的生命周期和依赖关系,Spring AOP则为日志、事务、安全等横切...
Hibernate是Java环境下的一款优秀的ORM(Object-Relational Mapping)框架,它提供了对象关系映射的解决方案,简化了数据库操作,使开发者能够以面向对象的方式操作数据库,无需直接编写SQL语句。 #### 在MyEclipse...
在IT行业中,集成开发环境(IDE)如MyEclipse是开发者的重要工具,它提供了一站式的解决方案来构建复杂的Web应用程序。本教程将详细介绍如何在MyEclipse中配置四大框架:Struts、Hibernate、Spring和FreeMarker,以...
中提到的"MyEclipse.Struts.Hibernate.Oracle开发实例源码"暗示了这是一个基于Java Web的项目,利用了MyEclipse作为开发工具,Struts作为MVC(模型-视图-控制器)框架,Hibernate作为对象关系映射(ORM)解决方案,...
它通过Hibernate.cfg.xml配置文件连接数据库,实体类(Entity)对应数据库表,属性对应字段,通过Session接口进行CRUD(创建、读取、更新、删除)操作。Hibernate的HQL(Hibernate Query Language)和Criteria API为...
总之,SpringMVC、Hibernate和Oracle的结合为开发人员提供了一种强大且灵活的后端解决方案,可以快速构建出稳定、高效的企业级应用。通过理解和熟练掌握这三个组件,开发者可以更高效地应对复杂的业务场景,提升开发...
在Hibernate中,实体类代表数据库表,实体类的对象代表表的行,而持久化操作如增删改查则通过Session接口实现。Hibernate通过配置文件hibernate.cfg.xml和映射文件(.hbm.xml)来定义这些映射关系。 在MyEclipse...
这是因为延迟加载需要有效的Hibernate Session来执行相关的SQL查询,而Session在关闭后就无法执行任何数据库操作。 针对这个问题,有以下两种常见的解决方案: 1. 修改延迟加载属性`lazy`为`false`: 在实体映射...
在MyEclipse中,需要导入Hibernate库,配置hibernate.cfg.xml文件,定义数据源、实体类和映射文件,接着创建SessionFactory,通过Session进行CRUD操作。 三、Spring框架 Spring是企业级应用的全面解决方案,包括...
所有对数据库的操作,如查询、插入、更新、删除,都可以通过Spring的JdbcTemplate或Hibernate的Session接口来实现,这样使得代码更简洁,也更易于测试和维护。 总结,这个“留言管理程序”通过Struts处理用户交互,...
8. **jboss-cache-1.4.1.GA.jar**:JBoss Cache是一个分布式缓存解决方案,它被Hibernate用作二级缓存机制,以提高数据访问性能。 9. **jboss-logging-3.1.0.CR2.jar**:这是JBoss的日志框架,用于记录Hibernate...
在Struts和Hibernate整合后,当用户发送请求时,Struts的Controller会调用相应的Action,Action再利用Hibernate进行数据库操作,最后将结果返回给View展示。这种模式使得开发者能专注于业务逻辑,而不是底层的数据库...
在本文中,我们将讨论如何在MyEclipse中配置Struts2、Spring和Hibernate这三个关键的Java Web框架。 首先,我们来关注MyEclipse对Struts2的支持。在MyEclipse 8.0 GA版本中,已经内置了对Struts2的集成。要添加...
2. Hibernate作为ORM框架的地位:Hibernate是Java ORM架构中的领导者,提供了一套完整的解决方案,包括对象的持久化、查询语言(HQL)和事务管理等。 四、Hibernate的相关配置 配置是使用Hibernate的第一步,主要...