【问题标题】:Why doesn't interceptor's onLoad() work?为什么拦截器的 onLoad() 不起作用?
【发布时间】:2009-06-11 06:39:09
【问题描述】:

我们有一个基于 jboss 的系统

persistance.xml 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
        http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
    <persistence-unit name="solutions" transaction-type="JTA">
        <jta-data-source>java:/mam</jta-data-source>

        <class>....</class>
        ......
        <class>....</class>

        <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <properties>

            <property name="hibernate.connection.datasource" value="java:/mam"/>
            <property name="jboss.entity.manager.factory.jndi.name" value="java:/solutions"/>

            <property name="hibernate.ejb.interceptor"
                      value="interceptor.AuditAndDeletableCatcherInterceptor"/>

            <property name="hibernate.hbm2ddl.auto" value="validate"/>
            <property name="hibernate.show_sql" value="false"/>
            <property name="hibernate.format_sql" value="false"/>
            <property name="hibernate.use_sql_comments" value="false"/>
            <property name="hibernate.generate_statistics" value="false"/>

            <property name="hibernate.bytecode.use_reflection_optimizer" value="cglib"/>
            <property name="hibernate.dialect" value="com.magenta.componentization.audit.sql.MySQL5CustomDialect"/>
            <property name="hibernate.query.substitutions" value="true 1, false 0"/>
            <property name="hibernate.connection.provider_class"
                      value="org.hibernate.connection.DatasourceConnectionProvider"/>
            <property name="hibernate.current_session_context_class" value="thread"/>

            <property name="cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/>
        </properties>
    </persistence-unit>

</persistence>

拦截器代码:

public class AuditAndDeletableCatcherInterceptor extends AuditInterceptor {

    DeletableCatcherDeligate deletableCatcherDeligate =
            new DeletableCatcherDeligate();

    @Override
    public boolean onLoad(Object o, Serializable serializable, Object[] objects, String[] strings, Type[] types) {
        deletableCatcherDeligate.onLoad(o, serializable, objects, strings, types);
        return super.onLoad(o, serializable, objects, strings, types);
    }
}

AuditInterceptor 扩展了原生 hibernate 的 EmptyInterceptor 并重载一些方法,如 onSave()、onFlush()、onPreFlush()

AuditAndDeletableCatcherInterceptor 的某些方法可以工作,但永远不会调用 onLoad()。 我做错了什么?

【问题讨论】:

    标签: java hibernate persistence interceptor


    【解决方案1】:

    仅当从数据库而不是缓存中检索对象时才调用onLoad。如果对象已被管理,则不会调用 onLoad。您可以通过实现 PrepareStatement 并查看它的作用来对此进行测试。我所做的是实现所有方法并在编写拦截器时将它们全部记录下来,然后我确切地知道它在做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-12
      • 2023-04-09
      • 2020-09-18
      • 1970-01-01
      • 1970-01-01
      • 2018-01-07
      • 2017-09-26
      相关资源
      最近更新 更多