春天注入SessionFactory,继承给出NullPointers

Mil*_*daD 1 java spring dao hibernate dependency-injection

在我的设计中,我的所有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;
}
Run Code Online (Sandbox Code Playgroud)

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

  <!-- 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>
Run Code Online (Sandbox Code Playgroud)

这是代码工作的时候,而不是上面代码中的最后一段代码,在"JPA Daos"注释下面是以下内容

<bean id="driverLocationDao" class="com.iit.awt.application.dao.impl.DriverLocationDaoImpl">
    <property name="sessionFactory" ref="daoSessionFactory" />
</bean>  
Run Code Online (Sandbox Code Playgroud)

需要注意的另一件事是,该类以前是抽象的,我尝试使用"abstract = true",并将其作为非抽象的当前方式

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

任何帮助是极大的赞赏

Jig*_*shi 5

你的问题

public void setSessionFactory(SessionFactory sessionFactory) {
    this.setHibernateTemplate(new HibernateTemplate(sessionFactory));
}
Run Code Online (Sandbox Code Playgroud)

你实际上并没有sessionFactory在这里设置,所以它会留下来null


更好的方法

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

AbstractDao的

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

}
Run Code Online (Sandbox Code Playgroud)

HibernateTemplate Bean定义 与会话工厂注入

 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
        <constructor-arg>
            <ref bean="sessionFactory"/>
        </constructor-arg>
    </bean>
Run Code Online (Sandbox Code Playgroud)

HibernateTemplate Bean Defination 与会话数据源注入和其他属性setter注入

 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
          p:dataSource-ref="dataSource">
        <property name="annotatedClasses">
            <list>...</list>
</property>
<bean>
Run Code Online (Sandbox Code Playgroud)