写了一个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。