5 Replies Latest reply on Jan 6, 2012 1:41 AM by aaaw

    How do I use Envers with custom session factory?

    aaaw

      Hi,

       

      We are using spring-hibernate.

      Hibernate version - 3.5.1

      Spring version - 3.0

       

      Envers - 3.5.6-Final

       

      I want to explore Envers for auditing the entities defined by us and have defined our own session factory bean which overrides AnnotationSessionFactoryBean.



      My session factory is created with spring using "AnnotationSessionFactoryBean". It is configured as follows:

       

      <bean id="factory" class="com.test.mappingmanager.hibernate.MySessionFactory.MySessionFactory">

                  <property name="jtaTransactionManager">

                  <bean factory-bean="txManagerJta" factory-method="getTransactionManager"/>

              </property>

       

       

              <property name="dataSource" ref="dataSource"/>

              <property name="mappingManager" ref="MappingModifier"/>

              <property name="mappingLocations">

                  <list>

                      <value>classpath*:com/test/**/*.hbm.xml</value>

                  </list>

                    </property>

       

                <property name="annotatedClasses">

                          <bean class="com.test.mappingmanager.hibernate.common.EntityBeanFinderFactoryBean">

                                    <property name="searchPatterns">

                                              <set>

                                                        <value>classpath*:com/test/**/**/pojo/*.class</value>

                                               </set>

                                    </property>

                          </bean>

                </property>

                    <property name="hibernateProperties">

                  <props>

                      <prop key="hibernate.dialect">#{dbProperties['hibernate.dialect']}</prop>

                      <prop key="hibernate.show_sql">#{dbProperties['show_sql']}</prop>

                      <prop key="hibernate.jdbc.use_streams_for_binary">#{dbProperties['hibernate.jdbc.use_streams_for_binary']}</prop>

                      <prop key="hibernate.connection.release_mode">after_statement</prop>

                      <prop key="hibernate.generate_statistics">true</prop>

                      <prop key="hibernate.current_session_context_class">jta</prop>

                      <prop key="hibernate.transaction.factory_class">#{dbProperties['hibernate.transaction.factory_class']}</prop>

                      <prop key="hibernate.transaction.manager_lookup_class">#{dbProperties['hibernate.transaction.manager_lookup_class']}</prop>

                       <prop key="hibernate.cache.use_second_level_cache">#{dbProperties['hibernate.cache.use_second_level_cache']}</prop>

                       <prop key="hibernate.cache.use_query_cache">#{dbProperties['hibernate.cache.use_query_cache']}</prop>

                       <prop key="hibernate.cache.provider_class">#{dbProperties['hibernate.cache.provider_class']}</prop>

                      <prop key="jta.UserTransaction">#{dbProperties['jta.UserTransaction']}</prop>

                  </props>

              </property>

      </bean>

       

      MySessionFactory extends AnnotationSessionFactoryBean.

       

      I defined following bean:

      <bean id ="enverseBean" class="org.hibernate.envers.event.AuditEventListener"></bean>

       

      and as soon as I add event listener by adding following lines to the above file and start server it goes in an infinite loop in LocalSessionFactoryBean.java and keeps on invoking setEventListeners method.

       

      <property name="eventListeners">

                     <map>

               <entry key="post-insert" value-ref="enverseBean" />

               <entry key="post-update" value-ref="enverseBean" />

               <entry key="post-delete" value-ref="enverseBean" />

               <entry key="pre-collection-update" value-ref="enverseBean" />

               <entry key="pre-collection-remove" value-ref="enverseBean" />

               <entry key="post-collection-recreate" value-ref="enverseBean" />

                     </map>

      </property>

       

       

      Could you please let me know how do I use/configure Envers with custom session factory?

       

      Thanks.

        • 1. Re: How do I use Envers with custom session factory?
          adamw

          Firstly, please use the same Hibernate and Envers versions, and report if the issue still happens

           

          Adam

          • 2. Re: How do I use Envers with custom session factory?
            aaaw

            Hi,

             

            Thanks for the quick reply. I tried with hibernate version 3.5.1-Final and Envers version 3.5.1-Final.

            But, still facing the same issue.

             

            Thanks.

             

            • 3. Re: How do I use Envers with custom session factory?
              adamw

              Ok It's always good to use matching versions.

               

              Did you look in the FAQ and on other Spring+Envers-related forum posts? I don't have much experience with Spring, but I know lots of people use that combination successfully.

               

              Adam

              • 4. Re: How do I use Envers with custom session factory?
                hernanbolido

                Hi!

                I'm using spring and envers successfully.

                The difference I can see is that I don't override the factory bean. Do you override the listener setting methods?

                 

                I define que event listeners properties different, but I don't think it could be a problem...

                 

                <property name="eventListeners">

                    <map>

                        <entry key="post-insert">

                            <ref bean="enversBean" />

                        </entry>

                        <entry key="post-update">

                            <ref bean="enversBean" />

                        </entry>

                        <entry key="post-delete">

                            <ref bean="enversBean" />

                        </entry>

                        <entry key="pre-collection-update">

                            <ref bean="enversBean" />

                        </entry>

                        <entry key="pre-collection-remove">

                            <ref bean="enversBean" />

                        </entry>

                        <entry key="post-collection-recreate">

                            <ref bean="enversBean" />

                        </entry>

                    </map>

                </property>

                 

                 

                Regards. Hernán.

                • 5. Re: How do I use Envers with custom session factory?
                  aaaw

                  Thanks for the reply.

                  I have not overriden the listener setting methods.

                   

                  Thanks.