如何使用 JHipster 和 Hibernate Envers

How to use JHipster and Hibernate Envers

我无法弄清楚如何使用 Hibernate Envers 和 JHipster。

我正在使用 PostgreSQL 存储数据,最新的 Jhipster 2.6.0 我刚刚生成了一个 JHipster 应用程序,根本没有进行任何修改。 用户域 class 扩展了具有 @Audited 注释的 AbstractAuditingEntity class,但是在编辑用户时没有在数据库中创建 t_user_aud table。

是否需要任何配置才能让 Hibernate Envers 保存修改?

我们目前使用 PersistentAuditEvent 实体来保存更改,而不是 "normal" t_user_aud table.

这是因为我们添加了额外的信息(这是为了安全审计),与 Envers 默认存储的信息相比。

我有一个 github 存储库,显示了如何为 jhipster 2.6.0 的 postgres 添加它

生成 jhipster 应用程序后,创建 postgres 数据库,生成实体(例如 yo jhipster:entity Foo),并应用所有以前的数据库修订版(运行 mvn spring-boot:run 以确保它运行s 以前的数据库修订版)。

警告: 'spring-data-envers' 导致 QueryDsl 中断。 (参见:https://github.com/spring-projects/spring-data-envers/issues/30). Furthermore, https://github.com/spring-projects/spring-data-envers/issues/33#issuecomment-108796022 说 'spring-data-envers' 项目不是优先事项。Jhipster 已经包含的 'hibernate-envers' 项目允许您使用 envers 而不需要 'spring-data-envers'...所以如果您想要为避免 QueryDsl 问题,请跳过步骤 1 和 3 删除 'spring-data-envers'。

  1. 将 spring-data-envers 添加到您的 pom.xml。

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-envers</artifactId>
        <version>0.2.0.RELEASE</version>
    </dependency>
    
  2. @Audited 添加到域包中的实体 class

  3. repositoryFactoryBeanClass=org.springframework.data.envers.repository.support.EnversRevisionRepositoryFactoryBean.class 添加到 DatabaseConfiguration.java 中的 @EnableJpaRepositories 注释(即更改行,使其类似于 @EnableJpaRepositories(basePackages="com.mycompany.myapp.repository", repositoryFactoryBeanClass=EnversRevisionRepositoryFactoryBean.class
  4. 添加扩展 DefaultRevisionEntity 的 CustomRevisionEntity 以将任何特殊内容添加到您的修订 tables(例如,进行更改的人的登录名)
  5. 添加实现 RevisionListener 的 CustomRevisionListener 以设置 CustomRevisionEntity 中的字段
  6. mvn liquibase:diff 将生成您的更改日志以添加审核
  7. 将更新日志添加到 src/main/resources/config/liquibase/master。xml

注意:liquibase-3.3.2 无法识别 INT4 用于 postgres 的 autoIncrement 并且会抛出这个 java.lang.RuntimeException: Unknown property autoIncrement for liquibase.datatype.core.UnknownType INT4。您可以将其更改为 'SERIAL',但您将与进一步生成的变更日志作斗争。我建议升级到 liquibase-3.3.3(参见 https://github.com/liquibase/liquibase/commit/1602ddf1cf4968753e09a6858fc1580230a2fb44),但您还必须将 <liquibaseShouldRun>true</liquibaseShouldRun> 添加到 pom.xml.

中的 liquibase 插件配置

注意:当您运行您的测试(使用 H2)时,H2 期望 REVTYPE 是 tinyint 而不是 smallint。忽略测试或添加类似这样的内容

<changeSet author="sdoxsee" id="1426529918864-0">
   <sql dbms="postgresql">CREATE DOMAIN "tinyint" AS smallint</sql>
</changeSet>

这样 H2 就会快乐,postgres 也会快乐。否则你会得到

org.hibernate.HibernateException: Wrong column type in JHIPSTER.PUBLIC.T_FOO_AUD for column REVTYPE. Found: smallint, expected: tinyint

当你 运行 mvn test

  1. mvn spring-boot:run 将再次应用更改日志
  2. 通过 运行ning 应用创建实体
  3. 打开 pgAdmin3 查看审核 table 历史记录!

希望这对您有所帮助。

我已经包含了来源:https://github.com/sdoxsee/jhipster-app-envers

有用的参考资料: