Java – Hibernate: myinterceptor #onflushdirty will never be called

Question: why never call myinterceptor #onflushdirty?

I extend abstractentitymanagerfactorybean in XML configuration

<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;
    }
}

Update: [explain why customizing dirty policies doesn't seem to be my way]

I want to update the modification timestamp every time I change the content in the folder entity excel folderposition At the same time, folderposition should be persistent rather than transient (meaning that it causes the entity to become dirty)

Because I use spring transactional and Hibernate templates, there are some subtle differences:

1) I cannot update the modification timestamp at the end of each setter, such as:

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) I can't call setmodified manually because it has about 25 fields, and setXXX of each field is scattered throughout the application I have no right to restructure

@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(); 
  }   
  ....
}

Solution

You need to extend the finddirty method instead of onflushdirty See this tutorial for details by referring to the GitHub working example

The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
分享
二维码
< <上一篇
下一篇>>