zoukankan      html  css  js  c++  java
  • Spring不能给sessionFactory注入值的问题,以及org.hibernate.HibernateException: createQuery is not valid without active transaction异常

          在Struts2+Spring3+Hibernate4的框架下,本来想在DAO中通过setter注入,给sessionFactory赋值,但是却出现NullPointerException的异常。经过调试,发现sessionFactory的值为null。后来发现,原来在service层中,这个DAO类的对象是通过new得来的,而不是通过Spring注入的。因此这个new出来的DAO对象,没有被Spring注入sessionFactory,必然它的sessionFactory为空了。于是改为由Spring提供该对象,成功解决该问题。

        其实Spring的意义与好处之一,就是将项目从new的“深渊”中解救出来,用Spring来通过依赖注入,统一提供对象,以实现低耦合(如果不用Spring,那么用工厂模式也可以实现这种效果。但是工厂模式这个对象还是需要new出来,因此没有Spring的依赖注入那么低耦合)。可是我却在这里用了new来创建对象,真是大大违背了Spring的主旨。这些代码是我很久以前写的,看来我那时候对Spring理解地不够深入。

        另一个问题是,在DAO文件中,通过sessionFactory.getCurrentSession()来获取会话,报异常:org.hibernate.HibernateException: createQuery is not valid without active transaction。经过实验,发现将Hibernate的配置文件中的<property name="current_session_context_class">thread</property>属性去掉就好了。原来"current_session_context_class"属性的意思是,设置当前会话的上下文环境,如果设置为thread,那么同一线程则共享同一session会话。因此通过getCurrentSession()得到的session,是同一线程上的session,而不是Spring管理的那个能够自动开启事务的session。去除掉该属性就好了。

        发现一些书上和网上均说明,如果要使用getCurrentSession(),必须在Hibernate的配置文件中加上<property name="current_session_context_class">thread</property>这个属性。我就是按照他们说的做的,结果却有问题。看来尽信书不如无书,别人一致认可的结论也不一定是正确的,在某些情况下可能是错的。

        

  • 相关阅读:
    程序员的7中武器
    需要强化的知识
    微软中国联合小i推出MSN群Beta 不需任何插件
    XML Notepad 2006 v2.0
    Sandcastle August 2006 Community Technology Preview
    [推荐] TechNet 广播 SQL Server 2000完结篇
    《太空帝国 4》(Space Empires IV)以及 xxMod 英文版 中文版 TDM Mod 英文版 中文版
    IronPython 1.0 RC2 更新 1.0.60816
    Microsoft .NET Framework 3.0 RC1
    《Oracle Developer Suite 10g》(Oracle Developer Suite 10g)V10.1.2.0.2
  • 原文地址:https://www.cnblogs.com/cestlavie/p/4194912.html
Copyright © 2011-2022 走看看