java - query - spring persistence configuration



Hibernate: MyInterceptor#onFlushDirty nunca é chamado (1)

Você precisa estender o método findDirty , não onFlushDirty . Verifique este tutorial para obter uma explicação detalhada com uma referência a um exemplo de trabalho do GitHub.

Pergunta: Por que MyInterceptor#onFlushDirty nunca é chamado?

Estendo AbstractEntityManagerFactoryBean em configurações xml como

<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: [explicação por que a política suja personalizada não parece da minha maneira]

Quero atualizar o registro de data e hora modified toda vez que alterar algo na entidade Folder EXCEPT folderPosition . Ao mesmo tempo, folderPosition deve ser persistente e não transitório (significa que a entidade folderPosition suja).

Devido ao uso de modelos transacionais e de hibernação do Spring, existem algumas nuances:

1) Não consigo atualizar o carimbo de data / hora modificado no final de cada setter, como:

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) Não posso chamar setModified manualmente, porque ele possui cerca de 25 campos, e setXXX para cada campo está espalhado por todo o aplicativo. E não tenho poder para refatorar.

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




orm