2010-07-12 16 views
12

Me estoy haciendo una excepción diciendo:Spring 3 Anotaciones - HibernateDaoSupport - Repositorio Requiere Sesión fábrica

java.lang.IllegalArgumentException: 'sessionFactory' o 'HibernateTemplate' se requiere

Cuando tratando de usar la anotación @Repository en una clase HibernateDaoSupport. El mensaje de error es sencillo, para crear el Repositorio necesita una sessionFactory. Sin embargo, he definido una fábrica de sesiones en mi 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> 

así que no estoy seguro de cómo dar el repositorio de la SessionFactory que requiere mientras se está creando es habas de anotación impulsada, he tratado de hacer lo siguiente:

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

Pero esto no resuelve el problema, probablemente porque el repositorio necesita que la propiedad al crear la instancia, no sólo cuando se realiza una acción. Lamentablemente, no sé cómo evitar este problema porque no hay constructores ni métodos de inicialización que anular con una @Autowired annotation.

Comprobé para asegurarme de que el bean sessionFactory se está creando y puede ser Autowired, y eso está bien.

+3

Puede que no desee utilizar Hibernatetemplate ya que no ofrece muchos beneficios http://blog.springsource.org/2007/06/26/so-should-you-still-use-springs-hibernatetemplate-andor- jpatemplate/ – vsingh

Respuesta

36

HibernateDaoSupport se suministra con SessionFactory a través de setSessionFactory(). Sin embargo, setSessionFactory() es final, por lo que no puede anularlo para agregar una anotación @Autowired. Pero puede aplicar @Autowired al método arbitrario y llamar setSessionFactory() de ella:

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

increíble, gracias! Ya comencé a seguir la ruta de usar la fábrica de sesiones directamente, pero me costaba abrir las transacciones, pero creo que iré con el DAOSupport, ya que funciona muy bien para mis simples propósitos. – walnutmon

+0

¡Agradable, funciona bastante bien! Gracias por la sugerencia @axtavt. –

6

También puede definir qué fábrica sesión que desea utilizar (si tiene más de uno, por ejemplo), mediante el uso de la anotación @Qualifier :

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

también puede alternar entre las fuentes de datos mediante la extensión de la AbstractRoutingDataSource. Ver this page.

Cuestiones relacionadas