My entity class:
@Entity
@Table(name = \"user\")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
Since @PrePersist and @PreUpdate are ignored when Hibernate Session is used I've made a relatively simple solution using Interceptors:
Define an interface "Auditable":
public interface Auditable {
public void setUpdated_at(Date date);
public void setCreated_at(Date date);
}
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;
}
}
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();
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: