I\'m trying to get Spring Data Auditing to work in my Spring 3.2.8 / Spring Data 1.5 / Hibernate 4 project.
As per the Spring Data Auditing docs, I\'ve added the
As of JPA 2.0, it is not possible to define such entity listener without an XML file (orm.xml
).
Default entity listeners—entity listeners that apply to all entities in the persistence unit—can be specified by means of the XML descriptor. (p.93)
If all entities in your project extends an AbstractAuditable
superclass then you can put @EntityListeners({AuditingEntityListener.class})
on AbstractAuditable
. Listeners attached to an entity class are inherited by its subclasses.
Multiple entity classes and mapped superclasses in an inheritance hierarchy may define listener classes and/or lifecycle callback methods directly on the class. (p.93)
Note that a subclass can exclude explicitly an inherited listener using the @ExcludeSuperclassListeners
annotation.
There is one last interesting footnote from the spec I'd like to quote:
Excluded listeners may be reintroduced on an entity class by listing them explicitly in the EntityListeners annotation or XML entity-listeners element. (Footnote [45] p.97)
Here is some code for illustrating the workaround:
AbstractAuditableEntity.java
import java.util.Date;
import javax.persistence.EntityListeners;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
@MappedSuperclass
@EntityListeners({AuditingEntityListener.class}) // AuditingEntityListener will also audit any subclasses of AbstractAuditable...
public abstract class AbstractAuditableEntity {
@Id
@GeneratedValue
private Long id;
@CreatedDate
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@LastModifiedDate
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
}
MyEntity.java
@Entity
public abstract class MyEntity extends AbstractAuditableEntity {
}
I think an interface Auditable
may be used (@EntityListeners
can appear on an interface) instead of an AbstractAuditable
class but I didn't try...
Reference: JSR-000317 Java Persistence 2.0 - Final Release