2011-12-20 2 views
1

В моей конструкции все мое DAOS наследовать от родительского класса, этот родительский класс содержит поле hibernateTemplate и setSessionFactory, которая создает hibernateTemplate от установки сеанса с помощью пружинногоВесна инъекция SessionFactory с наследованием дает NullPointers

Проблема здесь в том, что, хотя кажется, что она установлена, но когда я на самом деле выполняю код, а 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 является нулевым при запуске

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

Другая вещь, чтобы отметить, что класс был ранее абстрактным и я пытался, что с «абстрактным = истинный», а также иметь его неабстрактных текущий путь

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

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

+0

Пожалуйста, пост сигнатуру класса из ваших abstractdao –

ответ

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 с заводом на заводе-изготовителе

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

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

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

Спасибо большое за ответ, я использовал HibernateDaoSupport, и она работала – MilindaD

+0

прохладное приветствуется :) –

+1

С весны 3.1 использование HibernateTempalate и HibernateDaoSupport не рекомендуется. Пожалуйста, проверьте их документы для получения дополнительной информации. –

1

Кто подающее 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 рекомендации 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(). 
Смежные вопросы