标签:
在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>这个属性。我就是按照他们说的做的,结果却有问题。看来尽信书不如无书,别人一致认可的结论也不一定是正确的,在某些情况下可能是错的。
标签:
原文地址:http://www.cnblogs.com/cestlavie/p/4194912.html