Вопрос по spring – Hibernate Interceptor не работает

5

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

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>

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

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

Ваш Ответ

2   ответа
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;
}
@ gutch не могли бы вы посмотреть на очень похожий вопросstackoverflow.com/questions/27602318/… пожалуйста?
Привет, Гатч ... Я закомментировал части кода, так что вопрос здесь короче. Моя проблема в том, что он вообще не входит в перехватчик. Я поместил точку останова в перехватчик. Тем не менее, это никогда не выполняется. Я действительно невежественен. Kros
14

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

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

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

Еще одна загадка раскрыта ... :)

У меня была та же проблема - java.reflect.Type вместо org.hibernate.type. К счастью, я нашел этот ответ!
Который идет, чтобы показать вам, @Override полезен!
@ Крос, можешь посмотреть на очень похожий вопросstackoverflow.com/questions/27602318/… пожалуйста?

Похожие вопросы