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>
4

2 に答える 2

14

わかりました、記録のために、私はこの問題を解決しましたが、それは私の愚かな間違いであることが判明しました。

EmptyInterceptor を拡張するインターセプターを実装したときに、「onFlushDirty」メソッドなどを追加しました。ここまでは順調ですね。問題は、IDE を使用して使用済みクラスを自動インポートする際に、誤って org.hibernate.type.Type の代わりに java.reflect.Type をインポートしてしまったことです。したがって、実際にはインターセプター メソッドをオーバーライドしていませんでした。

メソッドに @Override インターセプターを追加したときに気付きました。

別の謎が解決しました... :)

于 2012-04-14T15:44:24.637 に答える