لا HibernateTemplate العمل مع للكشف والتدخل?إذا كان الأمر كذلك ، كيف ؟

StackOverflow https://stackoverflow.com/questions/1647894

سؤال

وأنا أحاول أن استخدام للكشف والتدخل في المشروع الذي يستخدم أيضا السبات و الربيع و أنا أقدر الكثير قانون الحد من تقدمها HibernateTemplate.

لقد تم تكوين للكشف والتدخل تحت JPA, و بعد بضعة تعديلات تمكنت من المخطط إنشاؤها بواسطة EnversHibernateToolTask النمل المهمة (بما في ذلك مراجعة الجداول).ومع ذلك ، عندما أكتب رمز مثل:

    hibernateTemplate.saveOrUpdate(f);

البيانات ما زالت قائمة ، ولكن لا شيء يذهب إلى تدقيق الجداول.على العكس من ذلك ، إذا أنا أكتب:

    EntityManager em = emf.createEntityManager();
    em.getTransaction().begin();
    em.persist(f);
    em.getTransaction().commit();

ثم البيانات تذهب إلى مراجعة الجداول (لكن أفضل استخدام السابقة جملة أعرف باستخدام JPA هو EntityManager فصل هذا الرمز من السبات ، لكنه بسيط لا يدفع عن المتاعب - تغيير ORM المحرك ليس في أحلامي لهذا المشروع.)

فإنه قد يساعد على التحقق من بلدي applicationContext.xml التكوين:

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceUnitName" value="projetox" />
    <property name="dataSource" ref="dataSource" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="true" />
        </bean>
    </property>
</bean>
<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

<bean id="sessionFactory"
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.w2it.projetox.model" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
        </props>
    </property>
</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
    destroy-method="close">
    ...
</bean>

و هنا هو بلدي persistence.xml الإعداد:

<persistence-unit name="projetox" transaction-type="RESOURCE_LOCAL">
    <jta-data-source>java:/DefaultDS</jta-data-source>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
        <!--  Hibernate Envers -->
        <property name="hibernate.ejb.event.post-insert"
            value="org.hibernate.envers.event.AuditEventListener" />
        <property name="hibernate.ejb.event.post-update"
            value="org.hibernate.envers.event.AuditEventListener" />
        <property name="hibernate.ejb.event.post-delete"
            value="org.hibernate.envers.event.AuditEventListener" />
        <property name="hibernate.ejb.event.pre-collection-update"
            value="org.hibernate.envers.event.AuditEventListener" />
        <property name="hibernate.ejb.event.pre-collection-remove"
            value="org.hibernate.envers.event.AuditEventListener" />
        <property name="hibernate.ejb.event.post-collection-recreate"
            value="org.hibernate.envers.event.AuditEventListener" />
    </properties>
</persistence-unit>

لا أحد يملك تلميح على ما يجري هنا ؟ شكرا لك!

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

المحلول

HibernateTemplate لها JPA نظيره ، JpaTemplate الذي يوفر وظائف مماثلة إلى حد ما.

السبب للكشف والتدخل لا يعمل مع HibernateTemplate لأنه يعتمد على JPA الأحداث (يمكنك أن ترى المستمعين أعلن في persistence.xml أعلاه) أثار عند EntityManager يستخدم.إنه من الممكن من الناحية النظرية أن كتابة التعليمات البرمجية لتشغيل تلك الأحداث من السبات الدورة عندما HibernateTemplate يستخدم, لكنه بدلا من المشاركة.

نصائح أخرى

كل ش فعله هو وضع @المعاملات في Dao أو الخدمات التي تدعو dao.حفظ()/ تحديث الأساليب.

حتى إذا قمت بتسجيل eventlistener هذه الأحداث لم تطلق إلا إذا كنت تستخدم transcational من ربيع مهاجم.الربيع ونقول لمعرفة السبات أن هذه الأحداث هي النار.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top