سؤال

لدي سؤال بسيط. من الممكن إضافة حقن التبعية عبر @ @ @autowired إلى Hibernate EventListener؟

سأريكم تكوين 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 وليس ContityManager Oder هل يمكنني تعديل SessionFactory في سياقتي؟ نأمل أن يكون لدى شخص ما فكرة لطيفة أو حل للتعامل مع هذه المشكلة!

شكرا جزيلا!

هل كانت مفيدة؟

المحلول

إذا استخدمت 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 ، أخشى أنك بحاجة إلى استخدام AOP كما هو موضح في هذا الموضوع

أو يمكنك

  1. قم بتخزين ApplicationContext في Threadlocal أو فئة حامل مخصصة وفضحه من خلال طريقة ثابتة
  2. احصل على فصل أساسي لمستمعيك شيء من هذا القبيل:

فئة القاعدة:

public abstract class ListenerBase{

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

}

الآن في مكالمة أساليب LifyCycle wireMe() أول.


تحديث:

هنا تنفيذ عينة من 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(){
    }

}

قم بتوصيله بتكوين حبوب الربيع مثل هذا:

<bean class="com.mycompany.ContextHelper" factory-method="getInstance" />
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top