2012-04-12 4 views
4

У меня есть простой HibernateInterceptor, в котором в основном я хочу установить несколько полей автоматически. Этот перехватчик (как показано ниже) расширяет EmptyInterceptor:Hibernate Interceptor не работает

public class EntityAuditInterceptor extends EmptyInterceptor { 

    /** 
    * The Serial Version UUID. 
    */ 
    private static final long serialVersionUID = 4636626262147801287L; 

    /* (non-Javadoc) 
    * @see org.hibernate.EmptyInterceptor#onFlushDirty(java.lang.Object, java.io.Serializable, java.lang.Object[], java.lang.Object[], java.lang.String[], org.hibernate.type.Type[]) 
    */ 
    public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) { 

     // doing stuff here 

     return false; 
    } 

    /* (non-Javadoc) 
    * @see org.hibernate.EmptyInterceptor#onSave(java.lang.Object, java.io.Serializable, java.lang.Object[], java.lang.String[], org.hibernate.type.Type[]) 
    */ 
    public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { 

       // doing stuff here 
     return false; 
    } 
} 

Я проводке с помощью файла конфигурации пружины следующим образом:

<!-- Hibernate SessionFactory --> 
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
     <property name="dataSource" ref="hsqlDbDataSource"/> 

     <property name="packagesToScan"> 
      <list> 
       <value>com.dreamteam.lms.**.*</value> 
      </list> 
     </property> 

     <!-- Adding Interceptor here --> 
     <property name="entityInterceptor"> 
      <bean class="com.dreamteam.lms.interceptors.EntityAuditInterceptor"></bean> 
     </property> 


     <property name="hibernateProperties"> 
      <props> 
       <!--<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>--> 
       <prop key="hibernate.dialect">org.hibernate.dialect.HSQLDialect</prop> 
       <prop key="hibernate.generate_statistics">true</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.cache.use_second_level_cache">true</prop> 
       <prop key="hibernate.hbm2ddl.auto">create</prop> 
       <prop key="hibernate.cache.use_query_cache">true</prop> 
       <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.SingletonEhCacheProvider</prop> 
      </props> 
     </property> 
    </bean> 

Однако Interceptor никогда не достигается. Кто-нибудь знает? Я также попытался добавить следующее определение менеджера транзакций боба следующим образом:

<property name="entityInterceptor"> 
     <ref local="entityAuditInterceptor"/> 
    </property> 

ответ

1

Похоже, ваша конфигурация Spring XML является правильным, так Hibernate должны называть свои методы перехватчиков. Однако эти методы всегда возвращают false, что означает, что Hibernate будет игнорировать любые сделанные вами изменения.

При изменении значения вы должны вернуть true. Например, этот код перебирает все свойства и возвращает true тогда и только тогда, когда изменение сделано:

public boolean onFlushDirty(Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames, Type[] types) { 
    boolean changed = false; 
    for (int i = 0; i < propertyNames.length; i++) { 
     if ("saveDate".equals(propertyNames[i])) { 
      currentState[i] = new Date(); 
      changed = true; 
     } 
    } 
    return changed; 
} 
+0

Привет gutch ... Я закомментировать части кода, так что вопрос здесь короче. Моя проблема в том, что она вообще не входит в перехватчик. Я поставил точку останова в перехватчике. Тем не менее, это никогда не выполняется. Я действительно не знаю. – Kros

+0

@gutch Вы могли бы посмотреть на очень похожий вопрос http://stackoverflow.com/questions/27602318/hibernate-myinterceptoronflushdirty-is-never-called pls? –

13

Ok, только для записи, я решил эту проблему, которая оказалась глупая ошибка с моей часть.

Когда я применил свой перехватчик, который расширяет EmptyInterceptor, я добавил метод 'onFlushDirty' и так далее. Все идет нормально. Проблема заключалась в том, что при использовании моей IDE для автоматического импорта используемых классов я в конечном итоге импортировал java.reflect.Type вместо org.hibernate.type.Type по ошибке. Следовательно, я действительно не переопределял метод перехватчика!

Я заметил, что когда я добавил перехватчик @Override к моему методу.

Еще одна загадка решена ... :)

+8

Что вам нужно, @Override полезен! – Yuval

+0

@ Крос вы можете посмотреть на очень похожий вопрос http://stackoverflow.com/questions/27602318/hibernate-myinterceptoronflushdirty-is-never-called pls? –

+0

У меня была та же проблема - java.reflect.Type вместо org.hibernate.type. К счастью, я нашел этот ответ! – olivmir

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