【问题标题】:Spring Data JPA Auditing never getting called at runtimeSpring Data JPA 审计永远不会在运行时被调用
【发布时间】:2014-01-02 20:20:10
【问题描述】:

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

我目前正在使用 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 目前引起了我的注意,但我已经在这方面花费了太长时间,因此可以使用任何帮助。

【问题讨论】:

  • 我正在努力解决可能存在的类似问题(请参阅stackoverflow.com/q/22341841/827480)。我已经配置了我的实体侦听器,但它们似乎被 Spring Data 忽略了。你能发布一个完整的例子(配置/等)来帮助我吗?

标签: spring-data-jpa


【解决方案1】:

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

Spring Data 的文档有点误导,因为它暗示您可以通过使用 @EnableJpaAuditing 注释 @Configuration 类来启用审计。

但是,我发现不清楚的部分是您仍然需要修改 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 审计类(这反过来又处理审计)。

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

@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)
    ...
    ...
}

【讨论】:

  • 我刚刚打了这个 - 感谢@Eric B 澄清细节!
【解决方案2】:

您似乎忘记在orm.xml 中配置AuditingEntityListener(这仍然是必要的)。将此行添加到您的 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.

【讨论】:

  • 谢谢,这就是我现在看到的(我以前有过,但后来删除了)。文档并不太清楚它仍然是必要的,还有另一个 SO 帖子 (stackoverflow.com/questions/19500637/…) 可以读取它不是,但 JavaDoc 指向它:github.com/spring-projects/spring-data-jpa/blob/master/src/main/…
  • 感谢您的帮助。我对 orm.xml 文件没有运气,我不想花更多的时间来弄清楚为什么,因为其他所有事情都是通过注释完成的。将带有注释的侦听器附加到@EntityListeners(AuditingEntityListener.class) 的技巧中,目前我认为我更喜欢在实体中可见的信息(可能最终带有元注释)。
  • 我必须在我想要审计的每个实体类上添加@EntityListeners 注释?
  • @herau 不确定您要问什么,但根据您要做什么以及所涉及的内容,会有不同的解决方案。您可以创建一个全局侦听器,然后检查该侦听器中的接口的实体或类似的东西。
猜你喜欢
  • 1970-01-01
  • 2015-01-20
  • 2020-06-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-09
  • 1970-01-01
  • 2018-04-05
相关资源
最近更新 更多