2010-11-10 13 views
8

Mam proste pytanie. Czy możliwe jest dodanie iniekcji zależności za pośrednictwem @Ressource lub @Aemowired do Eventlistener Hibernate?Spring + EntityManagerFactory + Hibernate Listeners + Injection

Pokażę ci moje EntityManagerFactory konfigurację:

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

w tej chwili zarejestrować słuchacza poprzez jpa.properties,

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

ale w tym przypadku nie mam zastrzyk sprężyny w moim słuchacza . Znalazłem rozwiązanie, ale czy używają one narzędzia sessionFactory, a nie od osoby uprawnionej czy mogę zmodyfikować środowisko sesji w moim kontekście? Mam nadzieję, że ktoś ma dobry pomysł lub sposób rozwiązania tego problemu!

Wielkie dzięki!

Odpowiedz

16

Jeśli użyto SessionFactory, to byłaby konfiguracja:

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

Ale skoro używasz JPA, obawiam się, trzeba użyć AOP przedstawionego in this thread

lub można

  1. Przechowuj ApplicationContext w klasie ThreadLocal lub niestandardowej klasy posiadacza i poddaj ją statycznej metodzie
  2. mieć klasę bazową dla swoich słuchaczy coś takiego: class

Podstawa:

public abstract class ListenerBase{ 

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

} 

Teraz w metodach lifycycle zadzwonić wireMe() pierwszy.


Aktualizacja:

Oto realizacja próbka 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(){ 
    } 

} 

drutu to w konfiguracji Wiosna Bean jak ten:

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

Cześć, dziękuję za Twój respone. Czy możesz mi powiedzieć, gdzie mogę znaleźć ContextHelper? Ich mają jeden z Hibernate.search.util. i Hibernate.search.event i nie ma żadnych metod "getCurrentApplicationContext()" – moohkooh

+0

Jest to klasa, którą musisz utworzyć. Załączam teraz przykładową wersję. –

+0

Wielkie dzięki wielkie, działa. Nie mogę ci powiedzieć, jak bardzo mi pomogłeś !! Wielkie wielkie dzięki! – moohkooh

Powiązane problemy