Can I use Spring Data JPA Auditing without the orm.xml file (using JavaConfig instead)?

前端 未结 3 910
感动是毒
感动是毒 2020-12-17 11:18

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

3条回答
  •  既然无缘
    2020-12-17 11:35

    Short version: No

    As of JPA 2.0, it is not possible to define such entity listener without an XML file (orm.xml).

    JPA 2.0:

    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)

    Long version: The workaround...

    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.

    JPA 2.0:

    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:

    JPA 2.0:

    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

提交回复
热议问题