Весеннее внедрение SessionFactory с наследованием, дающим NullPointers - PullRequest
1 голос
/ 20 декабря 2011

В моем дизайне все мои daos наследуются от родительского класса, этот родительский класс содержит поле hibernateTemplate и setSessionFactory, который создает hibernateTemplate при настройке сеанса с использованием spring

Проблема здесь в том, что, несмотря на то, что он, кажется, установлен, но когда я на самом деле выполняю код и вызовы daos, объект hibernateTemplate кажется нулевым. ОДНАКО, когда я внедряю объект 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 имеет значение 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>

И это когда код работает вместо последнего фрагмента кода выше под комментарием «JPA Daos», там есть следующее

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

Еще одна вещь, на которую следует обратить внимание, это то, что класс ранее был абстрактным, и я попробовал это с «abstract = true», а также с тем, чтобы он не был абстрактным в текущем виде

Кто-нибудь имеет представление о том, почему объект hibernateTemplate имеет значение null?

Любая помощь очень ценится

Ответы [ 2 ]

5 голосов
/ 20 декабря 2011

Ваша проблема

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

вы не на самом деле здесь sessionFactory, поэтому он останется null


Better Way

Я сделал это следующим образом, зачем создавать шаблон самостоятельно ..

AbstractDAO

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

}

Определение компонента HibernateTemplate с фабричным внедрением сеанса

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

Bean HibernateTemplateОпределение с внедрением источника данных сеанса и другим установщиком свойств

 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"
          p:dataSource-ref="dataSource">
        <property name="annotatedClasses">
            <list>...</list>
</property>
<bean>
1 голос
/ 20 декабря 2011

Кто внедряет шаблон hibernateTemplate в ваш код?Если вы расширяете HibernateDaoSupport, вам нужно только внедрить sessionFactory.метод getHibernateTemplate () ищет шаблон hibernate в своем родительском классе.Вот почему код ниже работает

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

Здесь инициализация шаблона гибернации не требуется.Если вы не расширяете hibernateDaoSuppor, вам придется внедрить шаблон, как упомянул @Jigar Joshi.

Обратите внимание, использование шаблона Hibernate не рекомендуется согласно рекомендациям Spring 3 здесь

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(). 
...