`
ConeyLiu
  • 浏览: 128141 次
  • 性别: Icon_minigender_2
  • 来自: 重庆
社区版块
存档分类
最新评论

转:getHibernateTemplate()更换getSession() hibernate3 默认支持延迟加载lazy SQL语句

 
阅读更多

转至:http://quyulu.blog.163.com/blog/static/3191360520101114115837861/

 

在项目中遇到数据库连接开了没有关闭导致在客户那边部署后网站运行了没多久就死了。连接不上数据库了。。

这是一篇搜索到的文章。。手动关闭session、仅供参考

 

一.getHibernateTemplate()更换getSession(),手动关闭session

 

问题:操作CLOB字段时出错

javax.servlet.ServletException: Could not commit Hibernate transaction; nested exception is org.hibernate.TransactionException: Transaction not successfully started

 

//***********新增********************// public boolean newDataObj(Object obj) { boolean ret=true; Session session=this.getHibernateTemplate().getSessionFactory().openSession(); try{ Transaction tx=session.beginTransaction(); session.save(obj); tx.commit(); } catch(Exception e){ e.printStackTrace(); logger.error(e); ret=false; } finally { if (session!= null && session.isOpen()) { session.close(); session = null; } } return ret; } //***********更新********************// public boolean updateDataObj(Object obj) { boolean ret=true; Session session=this.getHibernateTemplate().getSessionFactory().openSession(); try{ Transaction tx=session.beginTransaction(); session.update(obj); tx.commit(); } catch(Exception e) { e.printStackTrace(); logger.error(e); ret=false; } finally { if (session!= null && session.isOpen()) { session.close(); session = null; } } return ret; } //***********删除********************// public boolean deleteDateObj(Object obj) { boolean ret=true; Session session=this.getHibernateTemplate().getSessionFactory().openSession(); try { Transaction tx=session.beginTransaction(); session.delete(obj); tx.commit(); } catch (Exception e) { e.printStackTrace(); logger.error(e); ret=false; } finally { if (session != null && session.isOpen()) { session.close(); session = null; } } return ret; } //***********删除********************// public List<TDepartment> queryDep(String defaultDisplay) { List depList = null; Session session=this.getHibernateTemplate().getSessionFactory().openSession(); String hql = "from TDepartment tDepartment where tDepartment.isused='1' "; if(defaultDisplay!=null && !defaultDisplay.equals("")) hql += " and tDepartment.defaultDisplay='"+defaultDisplay+"' "; hql += " order by tDepartment.departmentId asc "; try { Query query = session.createQuery(hql); depList = query.list(); session.close(); } catch (HibernateException e) { e.printStackTrace(); } finally { if (session!= null && session.isOpen()) { session.close(); session = null; } } return depList; }


 

 

 

 

 

 

:

1.使用getSession()方法你只要继承sessionFactory,而使用getHibernateTemplate()方法必须继承

HibernateDaoSupport当然包括sessionFactory,这点区别都不是特别重要的,下面这些区别就很重要了

 


     2.getSession()

 

方法是没有经过spring包装的,spring会把最原始的session给你,在使用完之后必须自己调用相应close方法,

而且也不会对声明式事务进行相应的管理,一旦没有及时关闭连接,就会导致数据库连接池的连接数溢出,

 

 

getHibernateTemplate()

方法是经过spring封装的,例如添加相应的声明式事务管理,由spring管理相应的连接。


   
在实际的使用过程中发现的确getHibernateTemplate()getSession()方法要好很多,但是有些方法在

getHibernateTemplate()并没有提供,这时我们用HibernateCallback 回调的方法管理数据库.

 

getSession() 获得的是原始的sessionFactory,每次你必须自己维护session如结束后你必须关闭session。如果是hibernate中进行数据库操作,你获得是原始的hibernate styleexcepttion

 

hibernate templatespring包装过的,它会帮你管理session,并且它会将hibernate exceptions转换成其他的分类后的错误。这点getSession是肯定不行了。例如你用orclemysql返回的错误在getSession中就是不一样的,而在hibernate template中就是一样的。

 

实际使用中发现,对于基本的操作Hibernate template处理的的确比getSession要好,但到了复杂查询的时候如分页时需要调用getHibernateTemplate().execute(HibernateCallBack).要产生很多innerClass,调试非常不便。而getSession就相当简单多了。

 

=======================================================

 

二. 延迟加载

问题:无法加载关联项

错误页面提示

could not initialize proxy - no Session

控制台

org.hibernate.LazyInitializationException: could not initialize proxy - no Session

 

 

        <many-to-one

        name="fkTDepartment"

        column="FK_T_DEPARTMENT"

        class="com.commonfile.hibernate.TDepartment"

        lazy="false"

 

:

hibernate中:hibernate3 默认支持延迟加载(lazy="proxy"我们可以把proxy看作是true),hibernate2 默认立即加载 (lazy="false")。

hibernate3中,所有的实体设置文件(user.hbm.xml)中的lazy属性都被默认设成了true,就是当这个类没有被调用时,延时加载,导致了以上情况的发生,在配置文件中将lzay属性设为false

 

 

===============================================================================

 

.SQL语句 查询出错

select new TUser(tUser.id,tUser.userName,tUser.department,tUser.fkTStation,tUser.unitFlag) from TUser  tUser where tUser.id != 'f' and tUser.isused=1 and tUser.id not in (00309,00324,00338,00313,00311,00337) order by tUser.department.codepath, tUser.fkTStation.sequence,tUser.unitFlag, nlssort(tUser.userName,'NLS_SORT=SCHINESE_PINYIN_M')

 

: hibernate3不支持没有单引号”的条件查询

 

 

分享到:
评论

相关推荐

    使用原生sql.txt

    我就是问: getHibernateTemplate()这个方法里没有执行sql语句的方法,只能用hql语句吗?

    getHibernateTemplate()查询

    getHibernateTemplate()查询 hibernate hql

    第24次课-1 Spring与Hibernate的整合

    另外,从Spring 2.0开始增加了对命名SQL查询的支持,也增加了对分页的支持。 24.3 Spring对Hibernate的简化 24.3.3 HibernateTemplate的常用方法 void delete(Object entity):删除指定的持久化实例 void delete...

    getHibernateTemplate

    getHibernateTemplate()方法

    getHibernateTemplate()使用方法

    整合了hibernate的getHibernateTemplate()使用方法 全面详细 带有相应的例子

    gethibernatetemplate的find方法

    gethibernatetemplate的find方法,find(String queryString);find(String queryString , Object value);find(String queryString, Object[] values);findByExample(Object exampleEntity);findByExample(Object ...

    ssh(structs,spring,hibernate)框架中的上传下载

     需要指定的是Spring 1.2.5提供了两套Hibernate的支持包,其中Hibernate 2相关的封装类位于org.springframework.orm.hibernate2.*包中,而Hibernate 3.0的封装类位于org.springframework.orm.hibernate3.*包中,...

    Hibernate使用技巧汇总

    property-ref:关联类中用于与主控类相关联的属性名,默认为关联类的主键属性名 单向一对多需在一方配置,双向一对多需在双方进行配置 8.lazy=false:被动方的记录由hibernate负责记取,之后存放在主控...

    hibernate保存不到数据1

    解决getHibernateTemplate().save ()不能将数据保存到数据库的问题JusterDu 2016-03-15 08:38:57 1857

    getHibernateTemplate()有模糊查询和 分页

    getHibernateTemplate()有模糊查询和 分页getHibernateTemplate()有模糊查询和 分页

    getHibernateTemplate分页-模糊查询

    getHibernateTemplate分页-模糊查询.hibernate查询以及分页查询等方法使用。

    hibernate模板类详解

    find(String queryString , Object value); 示例:this.getHibernateTemplate().find("from bean.User u where u.name=?", "test"); 这样的例子里面还有很多

    jsp中调用dao的getHibernateTemplate()时,报空指针

    jsp中调用dao的getHibernateTemplate()时,报空指针

    Struts2 Spring hibernate 国际化 表单验证 安全退出

    这是之前分页的升级版 带国际化 表单验证 用户登录 安全退出 功能都实现了就是不太美观 开发环境 myeclipse6.0 jdk1.6 Tomcat6.0 sql2000 数据库也放到里面了 在db文件夹下 库文件不变 这里就不附带了log.jsp或者log...

    三大框架下分页源代码

    Query query = getHibernateTemplate().getSessionFactory().getCurrentSession().createQuery(sql); query.setFirstResult(pageno); query.setMaxResults(3); //设置每页显示的条数 List result = ...

    手机充值卡充值

    import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import vo.Card; import dao.ICardDAO; public class CardDAOImp extends HibernateDaoSupport implements ICardDAO{ @Override ...

    客户关系管理系统框架搭建(二)

    &lt;property name="hibernate.show_sql"&gt;true * 测试.放置在junit包下 public class TestHibernate { @Test public void testHibernateConf(){ Configuration ...

    spring_MVC源码

    文中用的框架版本:spring 3,hibernate 3,没有的,自己上网下。 先说web.xml配置: [java] view plaincopy 01.&lt;?xml version="1.0" encoding="UTF-8"?&gt; 02.&lt;web-app xmlns:xsi=...

    Hibernate中Criteria的完整用法.docx

    Spring 的框架提供了getHibernateTemplate ().findByCriteria(detachedCriteria) 方法可以很方便地根据DetachedCriteria 来返回查询结 果。 DetachedCriteria 提供了 2 个静态方法 forClass(Class) 或 forEntityName...

    火炬博客系统7

    软件及安装说明 &lt;br&gt; 本系统是一个Struts+Spring+Hibernate组合开发的博客系统,本系统使用分层体系架构,综合运用struts+spring+hibernate 三大主流开源框架构建,稳定高效、功能强大、易于维护。系统分为四个...

Global site tag (gtag.js) - Google Analytics