2010-07-12 17 views
12

Je reçois une exception en disant:Spring 3 Annotations - HibernateDaoSupport - Dépôt requis session usine

java.lang.IllegalArgumentException: 'sessionFactory' ou 'HibernateTemplate' est nécessaire

Lorsque essayer d'utiliser l'annotation @Repository sur une classe HibernateDaoSupport. Le message d'erreur est simple, afin de créer le référentiel, il a besoin d'une sessionFactory. Cependant, je l'ai défini une usine de session dans mon XML:

<!-- Hibernate --> 
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="dashDataSource" /> 
     <property name="annotatedClasses"> 
      <list> 
       <value>com.mycomp.myapp.Category</value> 
      </list> 
     </property> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
      </props> 
     </property> 
    </bean> 

Je ne suis pas sûr de savoir comment donner le dépôt SessionFactory qu'il exige alors qu'il est la création de c'est des haricots conduit d'annotation, je tentai de faire ce qui suit:

@Autowired 
    protected HibernateTemplate createHibernateTemplate(SessionFactory sessionFactory) { 
     return super.createHibernateTemplate(sessionFactory); 
    } 

Mais cela ne résout pas le problème, probablement parce que le dépôt a besoin de cette propriété lors de l'instanciation, non seulement lors de l'exécution d'une action. Malheureusement, je ne sais pas comment contourner ce problème car il n'y a pas de constructeur ou de méthode d'initialisation à redéfinir avec une annotation @Autowired.

J'ai vérifié pour m'assurer que le bean sessionFactory est en cours de création et peut être auto-amorcé, et c'est très bien.

+3

Vous ne voudrez plus utiliser Hibernatetemplate car il n'offre pas beaucoup d'avantages http://blog.springsource.org/2007/06/26/so-should-you-still-use-springs-hibernatetemplate-andor- jpatemplate/ – vsingh

Répondre

36

HibernateDaoSupport est fourni avec SessionFactory via setSessionFactory(). Toutefois, setSessionFactory() est final, vous ne pouvez donc pas le remplacer pour ajouter une annotation @Autowired. Mais vous pouvez appliquer @Autowired la méthode arbitraire et appeler setSessionFactory() de lui:

@Autowired 
public void init(SessionFactory factory) { 
    setSessionFactory(factory); 
} 
+1

génial, merci! J'ai déjà commencé à utiliser directement la fabrique de sessions, mais j'avais du mal à ouvrir des transactions, mais je pense que je vais aller avec le DAOSupport, car cela fonctionne très bien pour mes simples objectifs. – walnutmon

+0

Sympa, ça marche plutôt bien! Merci pour l'astuce @axtavt. –

6

Vous pouvez également définir quelle usine session que vous souhaitez utiliser (si vous avez plus d'un, par exemple), en utilisant l'annotation @Qualifier :

@Autowired 
public MyClassImpl(@Qualifier("myOtherSessionFactory") SessionFactory sessionFactory) { 
    setSessionFactory(sessionFactory); 
} 

Vous pouvez également basculer entre les sources de données en étendant la AbstractRoutingDataSource. Voir this page.