春天注入SessionFactory,继承给出NullPointers

时间:2011-12-20 18:28:11

标签: java hibernate spring dependency-injection dao

在我的设计中,我的所有daos都继承自父类,这个父类包含hibernateTemplate字段和一个setSessionFactory,它在使用spring设置会话时创建hibernateTemplate

这里的问题是,即使它似乎已经设置但是当我实际执行代码并且调用daos时,hibernateTemplate对象似乎为null。但是,当我使用会话工厂注入Dao对象而不是父通用类时,它就像魅力一样

AbstractDaoSupport类的一部分

/** The hibernate template. */
private HibernateTemplate hibernateTemplate;

/**
 * Sets the session factory.
 *
 * @param sessionFactory the new session factory
 */
public void setSessionFactory(SessionFactory sessionFactory) {
    this.setHibernateTemplate(new HibernateTemplate(sessionFactory));
}

/**
 * Sets the hibernate template.
 *
 * @param hibernateTemplate the hibernateTemplate to set
 */
public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
    this.hibernateTemplate = hibernateTemplate;
}

这是当前有问题的代码,其中hibernateTemplate在运行时为空

  <!-- the DataSource for application usage -->
    <bean id="applicationDataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://127.0.0.1:3306/taxidb"/>
        <property name="username" value="root"/>
        <property name="password" value="abc"/>
   </bean>      

    <bean id="daoSessionFactory"
        class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="applicationDataSource" />
        <property name="annotatedClasses">
            <list>
                <value>com.iit.awt.application.domain.Driver</value>
                <value>com.iit.awt.application.domain.DriverRealTimeCurrentLocation</value>
                <value>com.iit.awt.application.domain.Journey</value>
                <value>com.iit.awt.application.domain.Customer</value>
                <value>com.iit.awt.application.domain.SystemConstants</value>
                <value>com.iit.awt.application.domain.DriverRequest</value>             
                <value>com.iit.awt.application.domain.Account</value>
            </list>
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
                <prop key="hibernate.show_sql">true</prop>
            </props>
        </property>
    </bean>


    <bean id="transactionManager" 
          class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="daoSessionFactory"/>
    </bean> 

    <!-- JPA Daos -->
    <bean id="abstractDaoSupport" class="com.iit.awt.platform.support.AbstractDaoSupport">
        <property name="sessionFactory" ref="daoSessionFactory" />
    </bean>

这就是代码工作的时候,而不是上面代码中的最后一段代码,在“JPA Daos”评论中,以下是

<bean id="driverLocationDao" class="com.iit.awt.application.dao.impl.DriverLocationDaoImpl">
    <property name="sessionFactory" ref="daoSessionFactory" />
</bean>  

需要注意的另一件事是该类以前是抽象的,我尝试使用“abstract = true”以及使用非抽象的当前方式

有没有人知道为什么hibernateTemplate对象为null?

非常感谢任何帮助

2 个答案:

答案 0 :(得分:5)

您的问题

public void setSessionFactory(SessionFactory sessionFactory) {
    this.setHibernateTemplate(new HibernateTemplate(sessionFactory));
}

实际设置sessionFactory,所以它会保持null


更好的方式

我按照以下方式完成,为什么要自己创建模板..

<强> AbstractDao的

public abstract class BaseAbstractGenericDao<EntityType, IDType extends Serializable> extends HibernateDaoSuppor  {

}

HibernateTemplate Bean Defination with session factory injection

 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <constructor-arg>
            <ref bean="sessionFactory"/>
        </constructor-arg>
    </bean>

HibernateTemplate Bean Defination with session datasource injection和其他属性setter注入

 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
          p:dataSource-ref="dataSource">
        <property name="annotatedClasses">
            <list>...</list>
</property>
<bean>

答案 1 :(得分:1)

谁在您的代码中注入hibernateTemplate?如果你正在扩展HibernateDaoSupport,你只需要注入sessionFactory。 getHibernateTemplate()方法在其父类中查找hibernate模板。这就是下面的代码工作的原因

<bean id="driverLocationDao" class="com.iit.awt.application.dao.impl.DriverLocationDaoImpl">
   <property name="sessionFactory" ref="daoSessionFactory" />
</bean>  

这里不需要hibernate模板初始化。如果你没有扩展hibernateDaoSuppor,你将不得不像@Jigar Joshi所提到的那样注入模板。

请注意,建议不要使用Hibernate模板,因为Spring 3建议here

NOTE: As of Hibernate 3.0.1, transactional Hibernate access code can also be coded 
in plain Hibernate style. Hence, for newly started projects, consider adopting the
standard Hibernate3 style of coding data access objects instead, based on 
SessionFactory.getCurrentSession().