getSession()与getHibernateTemplate()区别
一直都很疑惑在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 );
- }
- }
@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;
- }
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 的多态?还是变态?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)