2010-11-08 29 views
13

j'ai un Hibernate DAO, en suivant avec API Hibernate 3 et Spring 3.x, j'utilise simplement un sessionFactory et PAS un HibernateDaoSupport + getHibernateTemplate() - J'espère que c'est un bon choix ... -Spring + Hibernate, autowire sessionFactory en veille prolongée OAC

Maintenant, mon objectif est d'autowire sessionFactory dans mon DAO en utilisant des annotations.

Dans mon spring.xml j'ai ceci:

<context:component-scan base-package="data" /> 

intérieur paquet de données que j'ai toutes mes DAO et les classes de service.

Ce mon simple, HibernateDao:

@Repository 
public class PersonHDAO implements PersonDAO { 

private SessionFactory sessionFactory; 

@Autowired 
public void setSessionFactory(SessionFactory sessionFactory) { 
    this.sessionFactory = sessionFactory; 
} 

public List<Person> findAll(){ 
    return sessionFactory.getCurrentSession().createQuery("bla bla").list(); 
} 
} 

Je n'ai pas erreur pendant le chargement spring.xml, mais sessionFactory encore être null.

Que dois-je faire?

EDIT

Ceci est ma déclaration sessionFactory dans spring.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:context="http://www.springframework.org/schema/context" 

     xsi:schemaLocation= 
     "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
     <!-- <property name="driverClassName" value="org.h2.Driver" /> --> 
     <property name="url" value="my/db/url" /> 
     <property name="username" value="myUsername" /> 
     <property name="password" value="myPassword" /> 
    </bean> 

    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="packagesToScan" value="data" /> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop> 
       <prop key="hibernate.current_session_context_class">thread</prop> 
       <prop key="hibernate.transaction.factory_class">org.hibernate.transaction.JDBCTransactionFactory</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.hbm2ddl.auto">update</prop> 
      </props> 
     </property> 
    </bean> 

    <context:component-scan base-package="data" /> 

    <tx:annotation-driven/> 

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 

</beans> 

EDIT2 Maintenant sessionFactory est pas nul, mais j'ai une autre sorte d'exception:

org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [data.PersonHDAO] is defined: expected single bean but found 0: 

Peut-être signifie qu'il ne peut pas trouver PersonHDAO bean?

Merci à tous.

Répondre

11

Avez-vous déclaré le bean sessionFactory?

<bean id="sessionFactory" 
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
<property name="configLocation"> 
<value>file:src/hibernate.cfg.xml</value> 
</property> 
</bean> 
+0

@Maurizio Cucchiara: Bien sûr, je modifier mon premier post avec un peu plus d'infos. – blow

+0

C'est une application web? Avez-vous déclaré org.springframework.web.context.ContextLoaderListener dans votre fichier web.xml? –

+0

@Maurizio Cucchiara: non c'est une application de bureau je n'ai pas de fichier web.xml. – blow

3

Je pense que votre problème est @Autowired

@Autowired 
private SessionFactory sessionFactory; 
2
@Autowired 
private SessionFactory sessionFactory; 

public void setSessionFactory(SessionFactory sessionFactory) { 
    this.sessionFactory = sessionFactory; 
}