在我的设计中,我所有的dao都从父类继承,该父类包含hibernateTemplate字段和setSessionFactory,该setSessionFactory在使用spring设置会话时创建hibernateTemplate
这里的问题是,即使它似乎已设置,但是当我实际执行代码并调用dao时,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?
任何帮助是极大的赞赏
最佳答案
你的问题
public void setSessionFactory(SessionFactory sessionFactory) {
this.setHibernateTemplate(new HibernateTemplate(sessionFactory));
}
您实际上并未在此处设置
sessionFactory
,因此它将保持为null
更好的方法
我已经按照以下方式完成了,为什么要自己创建模板。
摘要
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>