1

我定义的会话工厂null在 DAO 中。这是我的代码:

@Repository
public class LinkDetailsDAO {

     private SessionFactory sessionFactory;

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

     Session session = sessionFactory.getCurrentSession();

NullPointerException当我尝试创建会话对象时抛出一个。

我的应用程序上下文:

  <!-- Load Hibernate related configuration -->
  <import resource="hibernate-context.xml"/>

 <context:annotation-config/>
 <context:component-scan base-package="com.Neuverd.*"/>

我的休眠上下文:

 <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-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。

由于上述原因,应用程序在启动过程中抛出了一个BeanCreationExceptionfor 。LinkDetailsDAONullPointerException

sessionFactorybean和bean创建后transactionManager,当容器尝试创建LinkDetailsDAObean时,失败。我不明白为什么要null sessionFactory创建一个bean!尝试了春季文档sessionFactory中提到的。不工作。

4

1 回答 1

4

您尝试sessionFactory.getCurrentSession()在构造函数中调用。但是必须先构造对象,然后 Spring 才能调用 setter 并注入会话工厂。所以很明显,在构建时,会话工厂是空的。

即使会话工厂被注入到构造函数中并且您在之后请求会话,也不会有任何事务上下文,并且getCurrentSession()会抛出异常。

您应该仅从 DAO 的方法内部从工厂获取会话。这是获取当前会话的方法,即与当前事务关联的会话。

public void doSomething() {
    Session session = sessionFactory.getCurrentSession();
    ...
}
于 2012-07-25T14:48:22.237 回答