Hibernate一级缓存的思考

写了一个BaseDAO了,封装了所有数据库的操作
eg:
public List findAll(final Class entity) {
Session sn = null;
List list = null;
try {
sn = HibernateSessionFactory.getSession();
// Transaction ts = sn.beginTransaction();
list = sn.createQuery(" from " + entity.getName()).list();
// ts.commit();
} catch (Exception ex) {
logger.error("find() error:" + ex.getMessage(), ex);
} finally {
HibernateSessionFactory.closeSession();
}
return list;
}

关闭了session后一级缓存就不能使用了,就会每次查询一下数据库啦。

不关的话, 就到自己的DAO中去手动关闭啦。是不是也只能这样了 ,还有什么好的设计没?

个人建议不要这样做封装。你自己也明白这样封装会带来隐患的。。我也特意查看了下几个开源项目的源代码,dao的类很多,可能让人感觉重复的地方也很多,但是也不会做这样的封装。

所以原来该怎么写就怎么写吧。这种层次的抽象如果能做到,我想框架早也会提供了。

可以把Session 暴露出来,不管使不使用Spring 框架,灵活性会大大提高。

[code="java"]
class BaseDAO{

}

[/code]

[code="java"]
class BaseDao{
BaseDao(Session sesion){}

}

class ProductDao extends BaseDao{}
[/code]
如果不使用spring的话,可以使用DaoFactory 来创建Dao.
[code="java"]
class DaoFactory{

ProductDao createProductDao(){
return ProdcutDao(getSession());
}

public Session getSession(){}
}
[/code]

使用Spring直接注入就行了。
解决lazy load异常问题都是一样的。使用Hibernate Filter,通用的方式在Hibernate wiki上提供了实现。
Spring提供了一个实现,可以参考Spring 的参考手册。
Spring 还提供了一个HibernateInteceptor。