我定义的会话工厂在DAO中为null。这是我的代码:
@Repository
public class LinkDetailsDAO {
private SessionFactory sessionFactory;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
Session session = sessionFactory.getCurrentSession();
当我尝试创建会话对象时,抛出一个空指针。
我的applicationContext:
<!-- Load Hibernate related configuration -->
<import resource="hibernate-context.xml"/>
<context:annotation-config/>
<context:component-scan base-package="com.Neuverd.*"/>
我的hibernate-context:
<context:property-placeholder location="/WEB-INF/config/testapp.properties" />
<!-- Enable annotation style of managing transactions -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- Declare the Hibernate SessionFactory for retrieving Hibernate sessions -->
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
p:dataSource-ref="dataSource"
p:configLocation="/WEB-INF/config/hibernate.cfg.xml"
p:packagesToScan="com.Neuverd"/>
<!-- Declare a datasource that has pooling capabilities-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close"
p:driverClassName="${app.jdbc.driverClassName}"
p:url="${app.jdbc.url}"
p:username="${app.jdbc.username}"
p:password="${app.jdbc.password}"
/>
和我的hibernate配置文件
<hibernate-configuration>
<session-factory>
<!-- We're using MySQL database so the dialect needs to MySQL as well-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property>
<!-- Enable this to see the SQL statements in the logs-->
<property name="show_sql">true</property>
<property name="hbm2ddl.auto">create</property>
</session-factory>
</hibernate-configuration>
我也试过使用@Resource注释。但没有运气。我使用的是Spring 3.1和Hibernate 4.1。
应用程序在启动期间为LinkDetailsDAO抛出beancreationexception,这是由于上面提到的nullpointer引起的。
在创建sessionfactory bean和transactionManager bean之后,当容器尝试创建LinkDetailsDAO bean时,它会失败。我不明白为什么会创建一个null sessionfactory bean !!尝试了spring doc中提到的sessionfactory。不工作。
答案 0 :(得分:3)
您尝试在构造函数中调用sessionFactory.getCurrentSession()
。但是在Spring可以调用setter并注入会话工厂之前,必须首先构造对象。很明显,在构建时,会话工厂为空。
即使会话工厂是在构造函数中注入的,并且您之后要求会话,也不会有任何事务上下文,getCurrentSession()
会抛出异常。
您应该仅从DAO的方法内部来自工厂。这是获取当前会话的方式,即与当前事务关联的会话。
public void doSomething() {
Session session = sessionFactory.getCurrentSession();
...
}