2010-11-10 6 views
8

J'ai une question simple. Est-il possible d'ajouter l'injection de dépendance via @Ressource ou @Autowired à l'Hibernate Eventlistener?Spring + EntityManagerFactory + Hibernate Listeners + Injection

Je vais vous montrer ma configuration 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> 

Au moment où j'enregistrer mon auditeur via jpa.properties,

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

mais dans ce cas je n'ai aucune injection de printemps dans mon auditeur . J'ai trouvé une solution, mais celle-ci utilise la sessionFactory et non le gestionnaire d'entité ou est-ce que je peux modifier la sessionfactory dans mon contexte? J'espère que quelqu'un aura une bonne idée ou solution pour faire face à cette problématique!

Un grand merci!

Répondre

16

Si vous utilisez SessionFactory, ce serait la configuration:

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

Mais puisque vous utilisez JPA, je crains que vous devez utiliser AOP comme indiqué in this thread

Ou vous pouvez

  1. stockez ApplicationContext dans une classe ThreadLocal ou un conteneur personnalisé et l'exposer via une méthode statique
  2. ont une classe de base pour vos auditeurs quelque chose comme ceci:

Classe de base:

public abstract class ListenerBase{ 

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

} 

maintenant dans vos méthodes de lifycycle appeler wireMe() premier.


Mise à jour:

Voici une exemple d'implémentation 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(){ 
    } 

} 

fil dans votre configuration Spring Bean comme ceci:

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

Salut, merci pour votre respone. Pouvez-vous s'il vous plaît me dire où je trouve le ContextHelper? J'en ai un de Hibernate.search.util. et Hibernate.search.event et il n'y a aucune méthode "getCurrentApplicationContext()" – moohkooh

+0

C'est une classe que vous devez créer. J'ai maintenant joint une version d'échantillon. –

+0

Grand merci beaucoup, ça marche. Je ne peux pas vous dire, combien vous m'avez aidé !! Grand grand merci !! Ce – moohkooh