Spring SessionFactory注入问题

时间:2011-07-03 20:05:15

标签: java hibernate spring spring-mvc dependency-injection

我一直在努力学习使用Spring 3.0.x的各种功能,当我尝试将会话工厂注入DAO实现时,我遇到了一个问题。当我尝试使用我注入的SessionFactory实例变量时,我收到一个NullPointerException,这导致我相信bean定义中存在问题。

调度-servlet.xml中

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd">

  <context:component-scan base-package="com.timerecorder"/>

  <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
    <property name="prefix" value="/WEB-INF/jsp/"/>
    <property name="suffix" value=".jsp"/>
  </bean>

  <bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
    <property name="url" value="jdbc:oracle:thin:@xxx.xxx.x.xxx:xxxx:xx"/>
    <property name="username" value="xxx"/>
    <property name="password" value="xxx"/>
  </bean>

  <bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="myDataSource"/>
    <property name="hibernateProperties">
        <value>
            hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
        </value>
    </property>
  </bean>

</beans>

EntryImpl.java

package com.timerecorder.entity;

import java.util.List;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

@Repository
public class EntryImpl implements EntryDao
{

  private SessionFactory sessionFactory;

  @Autowired
  public void setSessionFactory(SessionFactory sessionFactory) 
  {
      this.sessionFactory = sessionFactory;
  }

  @Override
  public boolean saveEntry(EntryForm efd) 
  {
      // Place the details from the entry form into the Entry entity
      Entry e = new Entry();
      e.setId(Long.valueOf(efd.getUserId()));

      this.sessionFactory.getCurrentSession().save(e);

      return true;
  }

  @Override
  public boolean removeEntry(Long id) 
  {
      throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public List getEntries(Long id) 
  {
      throw new UnsupportedOperationException("Not supported yet.");
  }

  @Override
  public Entry getEntry(Long id) 
  {
      return new Entry();
  }

}

任何帮助都将不胜感激。

亲切的问候,

贾斯汀

3 个答案:

答案 0 :(得分:2)

看起来它可能是您的bean定义中的命名约定问题。

尝试重命名

id= "mySessionFactory"

id= "sessionFactory"

如果有帮助,请告诉我。

答案 1 :(得分:0)

看起来你是按名称自动装配,但你需要按类型自动装配你的sessionFactory - 或者你可以将bean定义重命名为sessionFactory,它应该可以正常工作。

此外,您需要确保将bean从应用程序上下文中取出而不仅仅是新建它。

答案 2 :(得分:0)

尝试使用init()方法自动装配会话工厂。

这就是我的工作方式 - &gt;

@Repository
public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
    @Autowired
    public void init(SessionFactory factory) {
        setSessionFactory(factory);
    }
}

setSessionFactory是HibernateDaoSupport提供的方法