Spring Data JPA审计永远不会在运行时调用

时间:2014-01-02 20:20:11

标签: spring-data-jpa

我目前正努力让Spring Data JPA审核工作,它目前没有设置字段,并且在使用Entities时似乎没有以任何方式调用。特别是任何洞察它如何挂钩持久实体的标准流程都会有所帮助。

我目前正在使用Spring Data JPA 1.5.0.M1和Spring 3.2.6,审计部分的基本配置是:

@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorAware")
@EnableJpaRepositories(basePackages = "org.myproject.dao")
@EnableTransactionManagement
public class JpaConfig {
...}

此时相关实体在尝试解决此问题时标记了界面(注释将是首选)。我意识到这不应该做,但我暂时复制和粘贴。

@Entity
public class AutoDraft implements Auditable<Long, Long> {

    @SequenceGenerator(name="seq_auto_draft", sequenceName="SEQ_AUTO_DRAFT")
    @GeneratedValue(strategy=GenerationType.SEQUENCE,generator="seq_auto_draft")
    @Id
    private Long id;

    @CreatedDate
    @Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")    
    private DateTime createdDate;

    @LastModifiedDate
    @Type(type="org.jadira.usertype.dateandtime.joda.PersistentDateTime")    
    private DateTime lastModifiedDate;

在日志中正在设置相关的bean,我可以在启动时捕获在AuditingEntityListener中正确配置的AuditingHandler,但似乎没有在运行时触发任何内容,也没有与特定实体关联的任何与审计相关的日志消息或存储库。我的注意力目前由AuditingBeanFactoryPostProcessor引起,但我已经花了太长时间在这上面,所以可以使用任何帮助。

2 个答案:

答案 0 :(得分:3)

我知道这是一个老问题,但我遇到了同样的问题并且评论帮我解决了。所以如果有人再次提出这个问题,我想我会更清楚。

Spring Data的文档有点误导,因为它意味着您只需使用@Configuration注释@EnableJpaAuditing类即可启用审核。

但是,我发现不清楚的部分是你仍然需要修改orm.xml文件(https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#auditing):

<persistence-unit-metadata>   
  <persistence-unit-defaults>
    <entity-listeners>
      <entity-listener class="….data.jpa.domain.support.AuditingEntityListener" />
    </entity-listeners>   
 </persistence-unit-defaults> 

但是,如果您使用的是基于纯注释的解决方案,则可能没有orm.xml文件。正如Matt Whipple在评论中指出的那样,您必须将@EntityListeners注释添加到实体类中,以便JPA持久性库在持久化对象时调用Spring审计类(这反过来会处理审计)。 / p>

所以一个完整的例子可能是:

@Configuration
@EnableJpaAuditing
@PropertySource({ "application.properties" })
public class AppConfig {
  /**
     * Stubbed method for the auditor as the app does not concern itself with auditing any User fields
     * Consequently, return null for the current auditor
     * @return
     */
    @Bean
    public AuditorAware<User> auditorProvider(){
        return new AuditorAware<User>() {
            @Override
            public User getCurrentAuditor() {
                return <User object that is Logged In>;
            }
        };
    }
}

然后在您的实体上:

@Entity
@EntityListeners(AuditingEntityListener.class)
public class Log {

    @Id
    @GeneratedValue
    private long id;

    @CreatedDate
    @Column(nullable=false)
    private Date createdOn;

    // bunch of other audit fields (and other fields)
    ...
    ...
}

答案 1 :(得分:2)

似乎您忘记在AuditingEntityListener中配置orm.xml(这仍然是必要的)。将此行添加到orm.xml

<persistence-unit-metadata>
  <persistence-unit-defaults>
    <entity-listeners>
      <entity-listener class="….data.jpa.domain.support.AuditingEntityListener" />
    </entity-listeners>
  </persistence-unit-defaults>
</persistence-unit-metadata>

请参阅:Spring data jpa documentation: Auditing.