복붙노트

[SPRING] 스프링 데이터 JPA 감사를 orm.xml 파일없이 (JavaConfig를 대신 사용하여) 사용할 수 있습니까?

SPRING

스프링 데이터 JPA 감사를 orm.xml 파일없이 (JavaConfig를 대신 사용하여) 사용할 수 있습니까?

Spring 3.2.8 / Spring Data 1.5 / Hibernate 4 프로젝트에서 작동하도록 Spring 데이터 감사를 얻으려고합니다.

Spring Data Auditing 문서에 따라 AuditorAware 구현에 의해 생성 된 엔티티에 @CreatedBy, etc 주석을 추가하고 JavaConfig 내에서이를 인스턴스화했습니다. 그러나 결코 발사되는 것처럼 보이지 않습니다.

나는 문서를 조금 혼란스럽게 생각한다. JavaConfig 항목이 xml 항목을 대체하는 것으로 보입니다. 그러나 확실하지 않습니다.

현재 애플리케이션에 orm.xml 파일이 없습니다. 전적으로 정직하기 위해서, 어디서 / 어떻게 구성해야하는지, 왜 필요하지는 않습니다. 모든 엔티티에서 특수 효과를 사용하고 있습니다. 엔터티에 @EntityListeners (AuditingEntityListener.class)를 추가하려고 시도했지만 도움이되지 않았습니다.

현재의 엔티티 관리자는 persistence.xml 파일없이 정의됩니다.

    <!--  entity manager -->
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter"/>
        <property name="packagesToScan" value="com.ia.domain"/>
        <property name="jpaProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
                <prop key="hibernate.query.substitutions">true '1', false '0'</prop>
                <prop key="hibernate.generate_statistics">true</prop>
                <prop key="hibernate.show_sql">false</prop>
                <prop key="hibernate.format_sql">true</prop>
                <prop key="hibernate.hbm2ddl.auto">update</prop>
                <prop key="hibernate.ejb.naming_strategy">org.hibernate.cfg.ImprovedNamingStrategy</prop>
                <prop key="hibernate.connection.charSet">UTF-8</prop>
            </props>
        </property>
    </bean>

JavaConfig :

@Configuration
@EnableJpaAuditing
public class AuditConfig {
    @Bean
    public AuditorAware<User> auditorProvider(){
        return new SpringSecurityAuditorAware();
    }
}

실재:

@EntityListeners({AuditingEntityListener.class})
@Entity
public class User
{

  @TableGenerator(name="UUIDGenerator", pkColumnValue="user_id", table="uuid_generator", allocationSize=1)
  @Id
  @GeneratedValue(strategy=GenerationType.TABLE, generator="UUIDGenerator")
  @Column(name="id")
  private Long id;

  @NotNull
  private String username;

  @CreatedDate
  @NotNull
  @Temporal(TemporalType.TIMESTAMP)
  @Column(name="created_date", nullable=false)
  private Date createdDate;

  @LastModifiedDate
  @NotNull
  @Temporal(TemporalType.TIMESTAMP)
  @Column(name="last_modified_date", nullable=false)
  private Date lastModifiedDate;

  @CreatedBy
  @ManyToOne(fetch=FetchType.LAZY)
  @JoinColumn(name="created_by")
  private User createdBy;

  @LastModifiedBy
  @ManyToOne(fetch=FetchType.LAZY)
  @JoinColumn(name="last_modified_by")
  private User lastModifiedBy;
  private String password;
  private Boolean enabled;


...
}

내 SpringSecurityAuditorAware 클래스에 중단 점을 넣었지만 절대로 안타깝습니다.

여전히 orm.xml 파일이 필요합니까? EntityManager에서 어떻게 참조 할 것인가?

해결법

  1. ==============================

    1.Stephan의 답변 https://stackoverflow.com/a/26240077/715640을 사용하면

    Stephan의 답변 https://stackoverflow.com/a/26240077/715640을 사용하면

    나는 커스텀 리스너를 사용하여이 작업을하고있다.

    @Configurable
    public class TimestampedEntityAuditListener {
    
        @PrePersist
        public void touchForCreate(AbstractTimestampedEntity target) {
            Date now = new Date();
            target.setCreated(now);
            target.setUpdated(now);
        }
    
        @PreUpdate
        public void touchForUpdate(AbstractTimestampedEntity target) {
            target.setUpdated(new Date());
        }
    }
    

    그리고 그것을 내 기본 클래스에서 참조 :

    @MappedSuperclass
    @EntityListeners({TimestampedEntityAuditListener.class})
    public abstract class AbstractTimestampedEntity implements Serializable {
    
        @Id
        @GeneratedValue(strategy = GenerationType.TABLE)
        private Long id;
    
        @Temporal(TemporalType.TIMESTAMP)
        private Date created;
    
        @Temporal(TemporalType.TIMESTAMP)
        private Date updated;
    
        public Date getCreated() {
            return created;
        }
    
        public void setCreated(Date created) {
            this.created = created;
        }
    
        public Date getUpdated() {
            return updated;
        }
    
        public void setUpdated(Date updated) {
            this.updated = updated;
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    }
    

    FWIW, orm.xml 파일없이 스프링 부트 프로젝트에서 사용하고 있습니다.

  2. ==============================

    2.JPA 2.0부터는 XML 파일 (orm.xml)없이 이러한 엔터티 수신기를 정의 할 수 없습니다.

    JPA 2.0부터는 XML 파일 (orm.xml)없이 이러한 엔터티 수신기를 정의 할 수 없습니다.

    프로젝트의 모든 엔티티가 AbstractAuditable 수퍼 클래스를 확장하면 @EntityListeners ({AuditingEntityListener.class})를 AbstractAuditable에 배치 할 수 있습니다. 엔티티 클래스에 첨부 된 리스너는 해당 서브 클래스에 상속됩니다.

    서브 클래스는 @ExcludeSuperclassListeners 주석을 사용해, 계승 된 청취자를 명시 적으로 제외 할 수 있습니다.

    인용하고 싶은 스펙에서 마지막으로 흥미로운 각주 하나가 있습니다.

    대안을 설명하기위한 몇 가지 코드는 다음과 같습니다.

    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 {
    
    }
    

    내 생각에는 인터페이스 Auditable (@EntityListeners는 인터페이스에 나타날 수 있음) 대신 AbstractAuditable 클래스가 사용될 수 있다고 생각하지만 시도하지 않았습니다.

    참조 : JSR-000317 Java Persistence 2.0 - 최종 릴리스

  3. ==============================

    3.1.9의 스프링 데이터에서 몇 개의 주석으로 JPA 감사를 사용할 수 있습니다.

    1.9의 스프링 데이터에서 몇 개의 주석으로 JPA 감사를 사용할 수 있습니다.

    문서에서 - http://docs.spring.io/spring-data/jpa/docs/1.9.4.RELEASE/reference/html/#jpa.auditing

    @EntityListeners (AuditingEntityListener.class) 주석을 사용하여 클래스 감사를 활성화합니다. 기본 클래스에서 사용합니다.

    @Configuration 클래스에 @EnableJpaAuditing이 필요하므로 일반적으로 감사가 가능합니다.

  4. from https://stackoverflow.com/questions/22362534/can-i-use-spring-data-jpa-auditing-without-the-orm-xml-file-using-javaconfig-in by cc-by-sa and MIT license