@Entity
@EntityListeners(class=Audit.class)
public class Cat {
@Id private Integer id;
private String name;
private Calendar dateOfBirth;
@Transient private int age;
private Date lastUpdate;
//getters and setters
/**
* Set my transient property at load time based on a calculation,
* note that a native Hibernate formula mapping is better for this purpose.
*/
@PostLoad
public void calculateAge() {
Calendar birth = new GregorianCalendar();
birth.setTime(dateOfBirth);
Calendar now = new GregorianCalendar();
now.setTime( new Date() );
int adjust = 0;
if ( now.get(Calendar.DAY_OF_YEAR) - birth.get(Calendar.DAY_OF_YEAR) < 0) {
adjust = -1;
}
age = now.get(Calendar.YEAR) - birth.get(Calendar.YEAR) + adjust;
}
}
public class LastUpdateListener {
/**
* automatic property set before any database persistence
*/
@PreUpdate
@PrePersist
public void setLastUpdate(Cat o) {
o.setLastUpdate( new Date() );
}
}
Example 2:
For Entity lifecycle events that we want them to be applied to multiple class, we centralize the callbacks.
Bar.java
@Data
@NoArgsConstructor
@Entity
@EntityListeners(AuditListener.class)
public class Bar {
@Id
@GeneratedValue
public Long id;
@Column(name = "operation")
private String operation;
@Column(name = "timestamp")
private long timestamp;
private String name;
Bar(String name) {
this.name = name;
}
}
AuditListener.java
public class AuditListener {
@PrePersist
@PreUpdate
@PreRemove
private void beforeAnyOperation(Object object) {
System.out.println("[Shark-AuditListener] " + object.toString());
}
}