How to autogenerate created or modified timestamp field?

后端 未结 8 1413
独厮守ぢ
独厮守ぢ 2020-12-05 03:11

My entity class:

@Entity
@Table(name = \"user\")
public class User implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
           


        
8条回答
  •  挽巷
    挽巷 (楼主)
    2020-12-05 03:31

    Since @PrePersist and @PreUpdate are ignored when Hibernate Session is used I've made a relatively simple solution using Interceptors:

    1. Define an interface "Auditable":

      public interface Auditable {
        public void setUpdated_at(Date date);
        public void setCreated_at(Date date);
      }
      
    2. Define a class "AuditableInterceptor"

      public class AuditableInterceptor extends EmptyInterceptor {
      
          private static final long serialVersionUID = -3557239720502671471L;
      
          @override
          public boolean onFlushDirty(Object entity,
                  Serializable id,
                  Object[] currentState,
                  Object[] previousState,
                  String[] propertyNames,
                  Type[] types) {
      
              if (entity instanceof Auditable) {
                  for (int i = 0; i < propertyNames.length; i++) {
                      if ("updated_at".equals(propertyNames[i])) {
                          currentState[i] = new Date();
                          return true;
                      }
                  }
              }
              return false;
          }
      
          @override
          public boolean onSave(Object entity,
                  Serializable id,
                  Object[] state,
                  String[] propertyNames,
                  Type[] types) {
      
              if (entity instanceof Auditable) {
                  for (int i = 0; i < propertyNames.length; i++) {
                      if ("created_at".equals(propertyNames[i])) {
                          state[i] = new Date();
                          return true;
                      }
                  }
              }
              return false;
          }
      }
      
    3. Specify the Interceptor when ever you open a new session (you'll likely have this in a utility class)

      sessionFactory.openSession(new AuditableInterceptor());
      // sessionFactory.openSession();
      
    4. Implement the Auditable interface in your entities, e.g.

      @Entity
      public class Product implements Auditable {
      
          ...
          private Date created_at;
          private Date updated_at;
          ...
      
          public Product() {
          }
      
          ...
      
          @Temporal(javax.persistence.TemporalType.TIMESTAMP)
          public Date getCreated_at() {
              return created_at;
          }
      
          public void setCreated_at(Date created_at) {
              this.created_at = created_at;
          }
      
          @Temporal(javax.persistence.TemporalType.TIMESTAMP)
          public Date getUpdated_at() {
              return updated_at;
          }            @Override
      
          @Override
          public void setUpdated_at(Date updated_at) {
              this.updated_at = updated_at;
          }
          ...
      }
      

    Notes:

    1. This example expects the properties created_at and updated_at. For different names the method names have also to be adapted.
    2. Type must be org.hibernate.type.Type!

提交回复
热议问题