当前位置: 首页 > 知识库问答 >
问题:

Hibernate:MyInterceptor#onFlushDirty从未被调用

凌远
2023-03-14

问题:为什么从不调用MyInterceptor#onFlushDirty

我在xml配置中扩展了AbstractEntityManagerFactoryBean,如

<bean id="myEntityManagerFactory" parent="abstractEntityManagerFactoryBean" abstract="true">
  <property name="entityInterceptor">
    <bean class="xxxx.MyInterceptor"/>
  </property>
</bean>
<bean id="abstractEntityManagerFactoryBean" class="xxxx.MyEntityManagerFactoryBean"/>

MyEntityManagerFactoryBean

public class MyEntityManagerFactoryBean extends AbstractEntityManagerFactoryBean implements LoadTimeWeaverAware {
  private Interceptor entityInterceptor;

  public Interceptor getEntityInterceptor() {
    return entityInterceptor;
  }

  public void setEntityInterceptor(Interceptor interceptor) {
    entityInterceptor = interceptor;
  }
}

MyInterceptor:

public class MyInterceptor extends EmptyInterceptor {

    public MyInterceptor() {
        System.out.println("init"); // Works well 
    }
    // PROBLEM - is never called
    @Override
    public boolean onFlushDirty(Object entity,
                                Serializable id,
                                Object[] currentState,
                                Object[] previousState,
                                String[] propertyNames,
                                Type[] types) {

        if (entity instanceof File) {
            .....
        }
        return false;
    }
}

更新:[解释为什么自定义脏政策看起来不像我的方式]

我希望每次更改文件夹实体中的内容时更新修改时间戳,但文件夹位置除外。同时,folderPosition应该是持久的,而不是暂时的(意味着导致实体变脏)。

由于我使用Spring事务和Hibernate模板,有一些细微差别:

1) 我无法在每个setter的末尾更新修改后的时间戳,如:

public void setXXX(XXX xxx) {
  //PROBLEM: Hibernate templates collect object via setters, 
  //means simple get query will cause multiple 'modified' timestamp updates
  this.xxx = xxx;
  this.modified = new Date();
}

2) 我不能手动调用setModified,因为它大约有25个字段,每个字段的setXXX分布在整个应用程序中。我没有权力进行重构。

@Entity
public class Folder {

  /**
   * GOAL: Changing of each of these fields except 'folderPosition' should cause 
   * 'modified' timestamp update
   */
  private long id;
  private String name;
  private Date created;
  private Date modified;
  private Integer folderLocation;

  @PreUpdate
  public void preUpdate() {
     //PROBLEM : change modified even if only location field has been changed!
     //PROBLEM: need to know which fields have been updated!
     modified = new Date(); 
  }   
  ....
}

共有1个答案

范彭亮
2023-03-14

您需要扩展finddrity方法而不是onFlushDirty。参考GitHub工作示例,查看本教程以获得详细解释。

 类似资料:
  • 我的从未被调用,即使我在inapp对话框中单击立即购买,logcat也不会打印任何内容。

  • 我想对我的实体更新进行审核。所以我实现了EmptyInterceptor My方法未执行,但执行了

  • 问题内容: 我有一个非常简单的Servlet和一个非常简单的HttpSessionListener: 我的方法从未被调用(没有日志输出),最终我在调用getSession()的那一行上得到一个 我尝试拨打电话时也没有问题,但存在相同的问题。 我不明白- 注释不足以调用我的侦听器吗?Eclipse甚至在下方将其显示为侦听器。 问题答案: 原来这是愚蠢的Eclipse问题之一… Project-> C

  • 我正在使用一个简单的并每隔毫秒调用: 问题是虽然计时器在正确的时间结束,但是方法并没有每毫秒被调用一次。每次都少了几毫秒。 我使用日志检查它,发现的值在最后是597,而它应该是999,因为每次调用时它都会得到1。有精度误差吗?

  • 我是写测试和使用Mockito的新手。我在Stackoverflow上阅读了类似的主题,并做了建议的更改,确保所考虑的类/接口/方法是开放的。 我试图跟踪这个 模仿构造函数注入的依赖项 这是我目前想出来的测试 但我一直得到的回应是 即使我在测试中没有提到这种方法,我也得到了这种反应。这是我的演示者注册方法。我已经改变了类/接口 同样地 这里是接口 感谢您的帮助。

  • 我正在为Angular7模板中的函数编写单元测试用例。它是一个登录组件,登录功能在http请求中具有router.navigate,以便在正确登录时路由到仪表板。但是我得到了错误 - 错误:应使用[['/ProjectData/MasterSequence']]调用spy navigate,但从未调用过。堆叠(http://localhost:9876/absolute/home/hp/Downl