2010-07-12 6 views
12

ich eine Ausnahme bin immer sagen:Frühling 3 Anmerkungen - HibernateDaoSupport - Repository Benötigt Session Werks

java.lang.IllegalArgumentException: 'session' oder 'HibernateTemplate' erforderlich ist

Wenn Versuchen Sie, die @Repository Annotation in einer HibernateDaoSupport-Klasse zu verwenden. Die Fehlermeldung ist einfach, um das Repository zu erstellen, benötigt es eine sessionFactory. Allerdings habe ich eine Sitzung Fabrik in meinem XML definiert:

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

Also ich bin nicht sicher, wie das Repository die Session geben, dass es erfordert, während sie es Annotation Driven Beans ist die Schaffung, ich versucht, die folgendes zu tun:

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

Aber das löst nicht das Problem, wahrscheinlich weil das Repository dieser Eigenschaft muss während der Instanziierung, nicht nur, wenn eine Aktion auszuführen. Leider kann ich dieses Problem nicht umgehen, da es keine Konstruktoren oder Initialisierungsmethoden gibt, die mit einer @Autowired-Annotation überschrieben werden können.

Ich überprüft, um sicherzustellen, dass die SessionFactory-Bean erstellt wird und kann Autowired werden, und das ist in Ordnung.

+3

Sie möchten HibernateTemplate nicht mehr verwenden, da es nicht viel Nutzen bietet http://blog.springsource.org/2007/06/26/so-should-you-still-use-springs-hibernatetemplate-andor- jpatemplate/ – vsingh

Antwort

36

HibernateDaoSupport wird mit SessionFactory über setSessionFactory() geliefert. setSessionFactory() ist jedoch final, Sie können sie also nicht überschreiben, um eine @Autowired Annotation hinzuzufügen. Aber man kann @Autowired die willkürliche Methode anwenden und ruft setSessionFactory() davon:

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

genial, danke! Ich habe bereits begonnen, die Session-Factory direkt zu nutzen, aber ich habe Schwierigkeiten, Transaktionen zu eröffnen. Ich denke, ich werde nur mit dem DAOSupport gehen, da es für meine einfachen Zwecke gut funktioniert. – walnutmon

+0

Schön, es funktioniert ziemlich gut! Danke für den Tipp @axtavt. –

6

Sie können auch die Sitzung Fabrik definieren Sie verwenden möchten (wenn Sie mehr als eine haben, zum Beispiel), unter Verwendung der @Qualifier Annotation :

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

Sie können auch durch die Erweiterung der AbstractRoutingDataSource zwischen Datenquellen wechseln. Siehe this page.