2010-11-10 2 views
8

Tengo una pregunta simple. Es posible agregar inyección de dependencia a través de @Ressource o @Autowired al Hibernate Eventlistener?Spring + EntityManagerFactory + Hibernate Listeners + Injection

voy a mostrar la configuración de mi EntityManagerFactory:

<bean id="entityManagerFactory" class="org.hibernate.ejb.EntityManagerFactoryImpl"> 
    <qualifier value="entityManagerFactory" /> 
    <constructor-arg> 
     <bean 
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
      <property name="persistenceUnitManager"> 
       <bean 
        class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManagerr"> 
        <property name="defaultDataSource" ref="dataSource" /> 
       </bean> 
      </property> 
      <property name="dataSource" ref="dataSource" /> 
      <property name="persistenceUnitName" value="mis" /> 
      <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence" /> 
      <property name="jpaProperties" ref="jpa.properties" /> 
      <property name="jpaDialect" ref="jpaDialect" /> 
      <property name="jpaVendorAdapter"> 
       <bean 
        class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
        <property name="generateDdl" value="true" /> 
        <property name="database"> 
         <util:constant 
          static-field="org.springframework.orm.jpa.vendor.Database.POSTGRESQL" /> 
        </property> 
        <property name="showSql" value="true" /> 
       </bean> 
      </property> 

     </bean> 
    </constructor-arg> 
</bean> 

Por el momento puedo registrar el oyente a través de jpa.properties,

hibernate.ejb.event.load=com.example.hibernate.events.LoadEvent 

pero en este caso no tengo ni la inyección de primavera en mi oyente . Encontré una solución, pero esta usa sessionFactory y no la entidad manager. ¿Puedo modificar sessionfactory en mi contexto? ¡Espero que alguien tenga una buena idea o solución para lidiar con esta problemática!

¡Muchas gracias!

Respuesta

16

Si utilizó SessionFactory, esta sería la configuración:

<bean id="mySessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <!-- Stripped other stuff --> 
    <property name="eventListeners"> 
     <map> 
      <entry key="pre-load"> 
       <bean class="com.mycompany.MyCustomHibernateEventListener1" /> 
      </entry> 
      <entry key="pre-persist"> 
       <bean class="com.mycompany.MyCustomHibernateEventListener2" /> 
      </entry> 
     </map> 
    </property> 
</bean> 

Pero dado que está utilizando JPA, me temo que es necesario utilizar AOP como se indica in this thread

O puede

  1. almacene el ApplicationContext en una clase de ThreadLocal o de un titular personalizado y exhíbalo a través de un método estático
  2. tienen una clase base para sus oyentes algo como esto: Clase

Base:

public abstract class ListenerBase{ 

    protected void wireMe(){ 
     ApplicationContext ctx = ContextHelper.getCurrentApplicationContext(); 
     ctx.getAutowireCapableBeanFactory().autowireBean(this); 
    } 

} 

Ahora en sus métodos lifycycle llamar wireMe() primero.


Actualización:

Aquí está un ejemplo de implementación de ContextHelper:

public final class ContextHelper implements ApplicationContextAware{ 

    private static final ContextHelper INSTANCE = new ContextHelper(); 
    private ApplicationContext applicationContext; 

    @Override 
    public void setApplicationContext(final ApplicationContext applicationContext){ 
     this.applicationContext = applicationContext; 
    } 

    public static ApplicationContext getCurrentApplicationContext(){ 
     return INSTANCE.applicationContext; 
    }; 

    public static ContextHelper getInstance(){ 
     return INSTANCE; 
    } 

    private ContextHelper(){ 
    } 

} 

alambre en la configuración de beans Spring así:

<bean class="com.mycompany.ContextHelper" factory-method="getInstance" /> 
+0

Hola, gracias por su respone ¿Puedes decirme dónde encuentro el ContextHelper? Ich tiene uno de Hibernate.search.util. e Hibernate.search.event y no tiene ningún método "getCurrentApplicationContext()" – moohkooh

+0

Es una clase que necesita crear. Ahora he adjuntado una versión de muestra. –

+0

Muchas gracias, funciona. No puedo decirte, ¡cuánto me ayudaste! Muchas gracias. – moohkooh

Cuestiones relacionadas