一直都很疑惑在spring框架中getSession与getHibernateTemplate的区别。相同的地方不用说大家都是调用数据库返回结果的。但为什么要这样有二个不同的兄弟呢。认真学习了一下(其实还是很粗略的)
从使用上看
getHibernateTemplate必须继承或实例HibernateDaoSupport当然包括sessionFactory
@SuppressWarnings("unchecked")
public T get(String id) {
T ret = (T) getHibernateTemplate().get(type, id);
if (ret == null) {
throw new ObjectRetrievalFailureException(type,
"can't get object with id " + id);
}
return ret;
}
public IResponseDataNPage findPageByCriteria(
final DetachedCriteria detachedCriteria, final Order order,
final int pageSize, final int startIndex) {
return (IResponseDataNPage) getHibernateTemplate().execute(
new HibernateCallback() {
public Object doInHibernate(Session session)
throws HibernateException {
Criteria criteria = detachedCriteria
.getExecutableCriteria(session);
int totalCount = ((Integer) criteria.setProjection(
Projections.rowCount()).uniqueResult())
.intValue();
criteria.setProjection(null);
if (order != null)
criteria.addOrder(order);
if(pageSize>0 && startIndex>=0)
{
criteria.setFirstResult(startIndex).setMaxResults(
pageSize);
}
List items = getHibernateTemplate().findByCriteria(
detachedCriteria);
// IResponseDataNPage ps = new IResponseDataNPage(items,
// totalCount, pageSize, startIndex);
IResponseDataNPage dataNPage = buildResponseDataNPage(
null, items, totalCount);
return dataNPage;
}
}, true);
}
}
getSession只有sessionFactory
public T get(final PK id) {
return (T) getSession().load(entityClass, id);
}
public Page<T> find(Page<T> page, String hql, Object... values) {
Assert.notNull(page);
Query q = createQuery(hql, values);
if (page.isFirstSetted()) {
q.setFirstResult(page.getFirst());
}
if (page.isPageSizeSetted()) {
q.setMaxResults(page.getPageSize());
}
page.setResult(q.list());
return page;
}
从上面可以看出getSession能实现与getHibernateTemplate完全一样的代码。
但getSession要自己实现一堆的功能。如createQuery等等。
但深入比较发现一下不同处:
getSession() 获得的是原始的sessionFactory,每次你必须自己维护session如结束后你必须关闭session。如果是hibernate中进行数据库操作,你获得是原始的hibernate style和excepttion。
而hibernate template是spring包装过的,它会帮你管理session,并且它会将hibernate exceptions转换成其他的分类后的错误。这点getSession是肯定不行了。例如你用orcle和mysql返回的错误在getSession中就是不一样的,而在hibernate template中就是一样的。
但我在实际使用中发现,对于基本的操作Hibernate template处理的的确比getSession要好,但到了复杂查询的时候如分页时需要调用getHibernateTemplate().execute(HibernateCallBack).要产生很多innerClass,调试非常不便。而getSession就相当简单多了。
总之:dao layer的设计五花八门,只能根据需要自己选择了。晕 java 的多态?还是变态?
分享到:
相关推荐
request.getSession().doc
主要介绍了java 中 request.getSession(true/false/null)的区别的相关资料,需要的朋友可以参考下
在网上经常看到有人对request.getSession(false)提出疑问,我第一次也很迷惑,看了一下J2EE1.3 API,看一下官网是怎么解释的。
Intent启动服务的示例代码Intent启动服务的示例代码 startService,stopService,bindService.unbindService用法的比较
使用filter拦截用户的请求,在filter中包装request,在request的包装类requestWrapper中,重写getSession(), 和getSession(boolean create)。自己实现httpSession,在getSession中获取cookie,从cookie中读取...
if (httpssessionmap.containsKey(userid)&&httpssessionmap.get(userid).equals(event.getSession())) { //userIds.remove(userid); httpssessionmap.remove(userid); if(u!=null && userid....
对hibernate的flush机制有兴趣可以看看
Map, Book> books = (Map, Book>)request.getSession().getServletContext().getAttribute("books"); Book book = books.get(bookid); System.out.println(book); //得到数量 int bookNum = Integer....
数据库连接工厂数据库连接工厂数据库连接工厂数据库连接工厂
--------------=======Spring 使用技巧========---------...//通过this.getSession()取得Session; Session session = this.getSession(); conn = session.connection(); ...(正常执行SQL,使用方法和JDBC使用方法一致)
mldn中李新华老师关于Java异常的捕获及处理的课堂记录
HashMap, Integer> map = (HashMap, Integer>) req.getSession().getAttribute("sessionGoods"); 3.写入链接a标签实现对映射的访问 out.write("<a href='./ShowGoods'><h1>继续购买</h1></a>");
request getSession setAttribute "mess" "恭喜 注册成功 " ; response sendRedirect "login jsp" ; }else{ response sendRedirect "error jsp" ; } }...
request.getSession (). GetAttributes() 答案: A 2. JSP页面需要创建仅在本页面使用的JavaBean的示例,为了完成此功能必须使用jsp:useBean的哪两个属性进行设置?(选择两个选项) A. id B. type C. name D. ...
type Exception report message description The server encountered an internal error () that prevented it from fulfilling this request. exception javax.servlet.ServletException: Servlet execution ...
from pubulic_way.get_token import getSession class testlogin(unittest.TestCase): def test_getIdentify(self): '''调用test_listCollectInfoByCreditId(self)响应数据中的taxid参数''' result = self.get_...
String planeImage = request.getSession().getServletContext().getRealPath("/image").replace("\\", "/")+"/"+"symark.png"; //获取目标图片的路径String targetPic = request.getSession().getServletContext()....
HttpServletRequest有两个重载的getSession()方法,一个接受一个boolean的类型的值,另一个不带任何参数,getSession()方法和getSession(true)方法功能一样,就是如果对应的客户端已经产生过一个session,那么就会...
HttpSession session=requ.getSession(); if(session.getAttribute("admin")==null){ PrintWriter out=res.getWriter(); out.println("[removed]"); out.println("alert('您还没有登录!');"); out....