使用hibernate的一个疑惑
其实这个疑惑应该和直接使用jdbc时一样的。
前面guty采用使用threadlocal的方式,很方面,但是这意味着,从web开始,后面的所有和数据库打交道的接口都需要hibernate的session,这也就意味着后面的操作都离不开hibernate了,这样使用dao模式的一个好处--可以替换持久层,就丧失了,采用dao的价值就大打折扣了。
我想这也是guty说得不需要dao的一个原因。
比如下面建立dao的接口就没有意义了。
public interface LookupDAO {
public List getRoles(Session ses) throws DAOException;
}
public class LookupDAOHibernate extends BaseDAOHibernate implements LookupDAO {
private Log log = LogFactory.getLog(LookupDAOHibernate.class);
public List getRoles(Session ses) throws DAOException {
List roleList = null;
if (log.isDebugEnabled()) {
log.debug("retrieving all role names...");
}
try {
Query q = ses.createQuery("from r in class " + Role.class + " order by name");
roleList = q.list();
ses.flush();
} catch (Exception e) {
e.printStackTrace();
throw new DAOException(e);
}
return roleList;
}
}
这个问题主要出现在需要事务处理的地方,这也是前面几个帖子讨论的关于事务处理的麻烦的地方。j2ee因为将事务放在配置里面,所以就不要这样传递seesion了。
我觉得选择hibernate某种程度上是排他的。混合使用hibernate和jdbc会导致接口不一致。同样混合使用hibernate和cmp也是会有问题的。
当项目规模不大时,互相转化的代价应该还是可以接受,如果项目庞大,恐怕在动手之前必须作出决定。