我需要获取@PostUpdate中保存(@PreUpdate)之前的对象值(preUpdateOrder)。

例如,@ PreUpdate的preUpdateOrder值为5,当我在@PostUpdate中访问preUpdateOrder时需要获取值5,其中postUpdateOrder为6。

这是我的代码,

public class AuditListener {

   private Order preUpdateOrder = new Order();
   private Order postUpdateOrder = new Order();

   @PreUpdate
   private void before(Object object) {
       if (object instanceof Order) {
           preUpdateOrder = ((Order) object);
       }
   }

   @PostUpdate
   private void after(Object object) {
       if (object instanceof Order) {
           postUpdateOrder = ((Order) object);

           if(preUpdateOrder.getId().equals(postUpdateOrder.getId())){
               System.out.println("true");
           }
       }
   }
}



@EntityListeners(AuditListener.class)
@Entity
public class Order{
}

最佳答案

JPA实体侦听器非常有限。没有办法获得旧状态。

您应该使用Hibernates拦截器功能。定义拦截器很容易:

public static class LoggingInterceptor extends EmptyInterceptor {
    @Override
    public boolean onFlushDirty(
        Object entity,
        Serializable id,
        Object[] currentState,
        Object[] previousState,
        String[] propertyNames,
        Type[] types) {

       // use old and new state
    }
}


然后,您必须在application.properties中设置hibernate属性:

spring.jpa.properties.hibernate.ejb.interceptor=yourpackage.LoggingInterceptor


请在官方文档中找到更多信息:https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#events

09-05 20:52