2011-12-20 84 views
1

在我的设计都是我的daos从父类继承,这个父类包含的HibernateTemplate领域,其在会话使用设置弹簧创建的HibernateTemplate了setSessionFactory春天注射继承给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的DAO”最后拼凑评论,以下是有

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

另外一点需要注意的是,类以前抽象的,我试过用“抽象=真”以及具有其非抽象的电流方式

有没有人对为什么HibernateTemplate的一个想法对象为null?

任何帮助是极大的赞赏

+0

请发表您的AbstractDao的的类签名 – 2011-12-20 18:48:02

回答

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的界定及 与会议工厂注入

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

的HibernateTemplate Bean的界定及 与会话的数据源注入和其他财产setter注入

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

非常感谢答案,我用的HibernateDaoSupport和它的工作 – MilindaD 2011-12-21 09:54:02

+0

酷欢迎您:) – 2011-12-21 09:54:35

+1

从Spring 3.1开始,不鼓励使用HibernateTempalate和HibernateDaoSupport。请检查他们的文档以获取更多信息 – 2013-03-18 14:37:33

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的模板作为每春天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().