2010-11-10 5 views
8

У меня есть простой вопрос. Можно ли добавить инъекцию зависимостей через @Ressource или @Autowired в Hibernate Eventlistener?Spring + EntityManagerFactory + Hibernate Listeners + Injection

Я покажу вам мою 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> 

На данный момент я зарегистрировать мой слушатель через jpa.properties,

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

, но в этом случае я не имею инъекций пружины в моем слушателе , Я нашел решение, но это использует sessionFactory, а не entitymanager, или я могу модифицировать sessionfactory в моем контексте? Надеюсь, у кого-то есть хорошая идея или решение, чтобы справиться с этой проблемой!

Большое спасибо!

ответ

16

Если вы использовали SessionFactory, это будет конфигурация:

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

Но так как вы используете JPA, я боюсь, что вы должны использовать АОП, как описано in this thread

Или вы можете

  1. хранить ApplicationContext в ThreadLocal или пользовательский класс держателя и подвергать его статическому методу
  2. есть базовый класс для слушателей нечто вроде этого:

Базовый класс:

public abstract class ListenerBase{ 

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

} 

Теперь в ваших методах lifycycle называют wireMe() первым.


Update:

Вот пример реализации 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(){ 
    } 

} 

провода это в конфигурации Spring Bean, как это:

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

Привет, спасибо за ваш respone. Не могли бы вы рассказать мне, где я нахожу ContextHelper? У меня есть один из Hibernate.search.util. и Hibernate.search.event, и нет методов «getCurrentApplicationContext()» – moohkooh

+0

Это класс, который вам нужно создать. Теперь я приложил примерную версию. –

+0

Большое спасибо, это работает. Я не могу сказать вам, сколько вы мне помогли !! Большое спасибо! – moohkooh

Смежные вопросы