2010-07-12 8 views
12

io sono sempre un'eccezione dicendo:Spring 3 NOTE - HibernateDaoSupport - Repository Richiede Sessione di fabbrica

java.lang.IllegalArgumentException: 'sessionFactory' o 'hibernateTemplate' è necessario

Quando cercando di utilizzare l'annotazione @Repository su una classe HibernateDaoSupport. Il messaggio di errore è semplice, per creare il Repository è necessario un sessionFactory. Tuttavia, ho definito una fabbrica di sessione nel mio 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> 

, quindi non sono sicuro di come dare il repository della SessionFactory che richiede mentre è la creazione è di annotazione guidato fagioli, ho tentato di fare quanto segue:

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

Ma questo non risolve il problema, probabilmente perché il repository ha bisogno che la proprietà, mentre un'istanza, non solo durante l'esecuzione di un'azione. Sfortunatamente, non so come aggirare questo problema perché non ci sono costruttori o metodi di inizializzazione da sovrascrivere con un'annotazione @Autowired.

Ho controllato che il bean sessionFactory sia stato creato e possa essere avviato automaticamente, e che va bene.

+3

Potresti non voler più utilizzare Hibernatetemplate poiché non offre molti vantaggi http://blog.springsource.org/2007/06/26/so-should-you-still-use-springs-hibernatetemplate-andor- jpatemplate/ – vsingh

risposta

36

HibernateDaoSupport viene fornito con SessionFactory tramite setSessionFactory(). Tuttavia, setSessionFactory() è final, quindi non è possibile sovrascriverlo per aggiungere un'annotazione @Autowired. Ma è possibile applicare @Autowired al metodo arbitrario e chiamare setSessionFactory() da esso:

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

fantastico, grazie! Ho già iniziato a seguire il percorso di utilizzo della factory di sessione direttamente, ma stavo cercando di aprire le transazioni, penso che andrò comunque con il supporto DAOS, dato che funziona alla grande per i miei scopi semplici. – walnutmon

+0

Bello, funziona piuttosto bene! Grazie per il suggerimento @axtavt. –

6

è inoltre possibile definire quale fabbrica di sessione che si desidera utilizzare (se si dispone di più di uno, per esempio), utilizzando il @Qualifier di annotazione :

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

È anche possibile alternare tra le fonti di dati, estendendo la AbstractRoutingDataSource. Vedi this page.

Problemi correlati