精华内容
下载资源
问答
  • Spring Data Envers API(Spring Data Envers 开发文档).CHM 官网 Spring Data Envers API
  • Hibernate Envers

    2019-10-06 03:40:00
    一、目的Hibernate Envers的目的是提供应用程序实体数据的历史版本,记录执行数据变更历史。二、用途Hibernate Envers记录的审计数据,主要用于意外丢失数据找回、审查数据合法性、辅助问题分析等用途。一般直接在...

    一、目的

    Hibernate Envers的目的是提供应用程序实体数据的历史版本,记录执行数据变更历史。

    二、用途

    Hibernate Envers记录的审计数据,主要用于意外丢失数据找回、审查数据合法性、辅助问题分析等用途。一般直接在数据库执行sql查询分析即可。

    三、实现原理

    为每个Audited的表创建一个对应的审计数据存储表,然后借助Hibernate Listener机制把对数据的增删改操作记录到审计表。(由此引申出的问题:随着业务操作的频繁,审计表数据增长很快)。

    四、配置方法

    以下是基于Spring的配置:

    1. 配置Envers事件监听器

    <bean id="sessionFactory" class="……Bean">
        <property name="eventListeners">
        <map>
        <entry key="post-insert" value-ref="enversEventListener" />
        <entry key="post-update" value-ref="enversEventListener" />
        <entry key="post-delete" value-ref="enversEventListener" />
        <entry key="post-collection-recreate" value-ref="enversEventListener" />
        <entry key="pre-collection-remove" value-ref="enversEventListener" />
        <entry key="pre-collection-update" value-ref="enversEventListener" />
        </map>
        </property>
        </bean>
        <bean name="enversEventListener" class="org.hibernate.envers.event.AuditEventListener" />


     2. 配置Envers相关属性

    <property name="hibernateProperties">
        <!-- 配置版本数据 -->
        <props>
        <!--配置审计表名的后缀,默认为空 -->
        <prop key="org.hibernate.envers.audit_table_suffix"></prop>
        <!--配置审计表名的前缀,默认为_AUD -->
        <prop key="org.hibernate.envers.audit_table_prefix">V_</prop>
        <!--配置审计表中记录版本号的字段名称 -->
        <prop key="org.hibernate.envers.revision_field_name">VER</prop>
        <!--配置审计表中数据操作类型的字段名称,0:新增 1:修改 2:删除 -->
        <prop key="org.hibernate.envers.revision_type_field_name">REVTYPE</prop>
        <!--配置是否支持关联表修改时记录修改记录,默认为true -->
        <prop key="org.hibernate.envers.revision_on_collection_change">true</prop>
        <!--配置是否不对乐观锁字段修改时记录修改记录,即使用Version字段,默认值为true -->
        <prop key="org.hibernate.envers.do_not_audit_optimistic_locking_field">true</prop>
        <!--配置是否在删除操作时,记录所有字段还是只记录id值。默认为false false:只记录id true:记录全部字段 -->
        <prop key="org.hibernate.envers.store_data_at_delete">true</prop>
        <!--配置审计表的schema,默认为null -->
        <prop key="org.hibernate.envers.default_schema">DateBaseName</prop>
        <!--配置审计表的catalog,默认为null -->
        <prop key="org.hibernate.envers.default_catalog"></prop>
        </props>
    </property>
    3. 实体对象配置

    给要增加审计记录的实体添加注解。

    @Audited 标记该实体类或属性支持数据修改记录。

    @NotAudited 标记该属性不支持数据修改记录。

    @RevisionEntity 实现为数据修改记录表保存其他自定义内容

    @RevisionTimestamp 记录修改时间,必须配合@RevisionEntity使用

    @RevisionNumber 修改记录表的版本id 通常是配置成主键

    给创建审计记录的实体添加注解

     @Audited
    
     public class AttGroup

    下面是使用Hibernate Envers后,操作数据生成的审计数据。

    1. 数据库中新增数据

    2.审计表中自动新增数据,但是,多了VER、REVTYPE字段,REVTYPE为0表示执行新增操作

    3. 执行修改操作

    4.修改之后,审计表中增加一条数据,VRE递增,REVTYPE为1,表示执行修改操作


    5.执行删除操作

    6.删除之后,审计表中又增加一条数据,VER递增,REVTYPE为2,表示执行删除操作

    转载于:https://www.cnblogs.com/xiang--liu/p/9710264.html

    展开全文
  • envers Envers是一个Hibernate模块,可以将其配置为自动审核对您的实体所做的更改。 因此,每个审核的实体都与修订列表相关联,每个修订都在发生更改时捕获实体的状态。 但是,在我对DAO进行“单元测试”时遇到了一...

    envers

    Envers是一个Hibernate模块,可以将其配置为自动审核对您的实体所做的更改。 因此,每个审核的实体都与修订列表相关联,每个修订都在发生更改时捕获实体的状态。 但是,在我对DAO进行“单元测试”时遇到了一个障碍,这就是我要分享的内容,以避免其他人陷入同一困境。

    首先,让我们概述使用Envers所需的几个步骤:

    • @Audited注释为您的实体注释:
      @Entity
      @Audited
      publicclassPerson{
          // Properties
      }
    • 通过Spring在您的Hibernate SessionFactory注册Envers AuditEventListener
      <beanid="sessionFactory"class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
          <propertyname="dataSource"ref="dataSource"/>
          <propertyname="packagesToScan"value="ch.frankel.blog.envers.entity"/>
          <propertyname="hibernateProperties">
              <props>
                  <propkey="hibernate.dialect"> org.hibernate.dialect.H2Dialect </prop>
              </props>
          </property>
          <propertyname="schemaUpdate"value="true"/>
          <propertyname="eventListeners">
              <map>
                  <entrykey="post-insert"value-ref="auditListener"/>
                  <entrykey="post-update"value-ref="auditListener"/>
                  <entrykey="post-delete"value-ref="auditListener"/>
                  <entrykey="pre-collection-update"value-ref="auditListener"/>
                  <entrykey="pre-collection-remove"value-ref="auditListener"/>
                  <entrykey="post-collection-recreate"value-ref="auditListener"/>
              </map>
          </property>
      </bean>
      <beanid="auditListener"class="org.hibernate.envers.event.AuditEventListener"/>
    • 将Hibernate事务管理器配置为您的事务管理器。 请注意,如果您使用其他事务管理器,则不会触发审核(想到DataSourceTransactionManager ):
      <beanid="transactionManager"class="org.springframework.orm.hibernate3.HibernateTransactionManager">
          <propertyname="sessionFactory"ref="sessionFactory"/>
      </bean>
    • 现在是时候创建测试类了:
      @ContextConfiguration("classpath:spring-persistence.xml")
      @TransactionConfiguration(defaultRollback=false)
      publicclassPersonDaoImplTestextendsAbstractTransactionalTestNGSpringContextTests{
      
          @Autowired
          privatePersonDaopersonDao;
      
          @BeforeMethod
          protectedvoidsetUp(){
              // Populate database
          }
      
          @Test
          publicvoidpersonShouldBeAudited(){
              Personperson=personDao.get(1L);
              person.setFirstName("Jane");
              List<Person>history=personDao.getPersonHistory(1L);
              assertNotNull(history);
              assertFalse(history.isEmpty());
              assertEquals(history.size(),1);
          }
      }

    奇怪的是,当您执行上一个测试类时,如果检查列表不为空,则测试方法将失败:是,这意味着没有与该实体相关联的修订。 Morevoer,日志中什么也没有显示。 但是, 修订在测试结束时显示在审核表中(前提是您没有在执行表后清除表)。

    出现了一个可怕的问题:为什么? 好吧,似乎仅在提交事务时才调用Hibernate事件后监听器。 在我们的例子中,它匹配:方法完成后,事务由Spring提交,我们的测试树在方法内部进行断言。

    为了使测试通过,我们必须方法内部手动管理事务,以将更新提交到数据库。

    @Test
    publicvoidpersonShouldBeAuditedWhenUpdatedWithManualTransaction(){
        PlatformTransactionManagertxMgr=applicationContext.getBean(PlatformTransactionManager.class);
    	// A new transaction is required, the wrapping transaction is for Envers
        TransactionStatusstatus=txMgr.getTransaction(newDefaultTransactionDefinition(PROPAGATION_REQUIRES_NEW));
        Personperson=personDao.get(1L);
        person.setFirstName("Jane");
        txMgr.commit(status);
        List<Person>history=personDao.getPersonHistory(1L);
        assertNotNull(history);
        assertFalse(history.isEmpty());
        assertEquals(history.size(),1);
    }

    一方面,测试通过,并且日志相应地显示了SQL命令。 另一方面,成本是使它通过所需的额外样板代码。

    当然,可以(应该?)首先质疑是否需要测试该功能。 由于它是库带来的功能,其背后的原因可能是,如果您不信任该库,则根本不要使用它。 就我而言,这是我第一次使用Envers,因此不可否认,我必须在我和图书馆之间建立信任。 但是,即使使用受信任的库,我也会测试特定的情况:例如,当使用Hibernate时,我会创建测试类以验证复杂的查询是否能为我提供正确的结果。 因此,审核被视为一个复杂的用例,我想尽快意识到其不良行为。

    您可以在此处以Maven / Eclipse格式找到本文的资源。

    翻译自: https://blog.frankel.ch/how-to-test-code-that-uses-envers/

    envers

    展开全文
  • hibernate envers

    2017-03-02 23:17:40
    hibernateEnvers的目的是提供应用程序实体数据的历史版本,记录执行数据变更历史 2.用途 Hibernate Envers记录的审计数据,主要用于意外丢失数据找回、审查数据合法性、辅助问题分析等用途。一般直接在数据库执行...

    http://docs.jboss.org/envers/docs/

    1.目的

     

    hibernate Envers的目的是提供应用程序实体数据的历史版本,记录执行数据变更历史

    2.用途

    Hibernate Envers记录的审计数据,主要用于意外丢失数据找回、审查数据合法性、辅助问题分析等用途。一般直接在数据库执行sql查询分析即可。

    3.问题

    为每个Audited的表创建一个对应的审计数据存储表,然后借助Hibernate Listener机制把对数据的增删改操作记录到审计表。(由此引申出的问题:随着业务操作的频繁,审计表数据增长很快)。

    4.配置

    5.conditional audit

     

     

    展开全文
  • Hibernate环境 有机会使用 Envers 对 eXo 的 wiki 实体进行版本控制
  • envers_分代缓存和Envers

    2020-06-02 11:55:52
    envers Konrad最近在我们公司的技术室中分享了有关如何完成缓存的有趣文章,这是一个大型的波兰社交网络nk.pl。 算法中的核心概念之一是分代缓存 (请参阅此处或此处 )。 基本思想是,对于缓存键,您使用一些特定...

    envers

    Konrad最近在我们公司的技术室中分享了有关如何完成缓存的有趣文章,这是一个大型的波兰社交网络nk.pl。 算法中的核心概念之一是分代缓存 (请参阅此处此处 )。 基本思想是,对于缓存键,您使用一些特定于实体的字符串+版本号。 每当数据更改时,版本号都会增加,从而使所有旧的缓存条目无效,并防止读取过时的数据。 这假设缓存具有一些垃圾回收,例如它可能只是LRU缓存。

    当然,对于每个请求,我们都必须知道版本号–这就是为什么必须将其存储在全局缓存中(但根据我们的一致性要求,它也可以异步分布在整个集群中)。 但是,数据本身可以存储在本地缓存中。 因此,如果我们的系统是只读的,那么每个请求唯一要做的“昂贵”操作就是检索我们感兴趣的实体的版本号。这通常是非常简单的信息,可以完全保留在-记忆。

    根据数据类型和使用模式,您可以缓存单个实体(例如,对于Person实体,缓存键可以是person-9128-123是id,版本号123)或全部(例如,对于一个Countries实体,缓存密钥可以是countries-8 ,版本号是8。 此外,在全局缓存中,您可以按ID或按实体保存最新的版本号; 意味着当版本更改时,您会使特定实体或所有实体无效。

    编写了大部分Envers之后 ,我自然就可以将实体修订号用作缓存版本 。 随后的Envers修订版是单调递增的数字,对于每个事务,您都会获得下一个。 因此,每当缓存的实体发生更改时,您都必须使用最新的修订版号填充全局缓存。

    Envers提供了几种获取修订号的方法。 在事务期间,您可以调用AuditReader .getCurrentRevision()方法,该方法将为您提供修订元数据,包括修订号。 如果您想要更细粒度的控制,则可以实现自己的侦听器( EntityTrackingRevisionListener ),请参阅docs ,并在实体更改时得到通知,并在那里更新全局缓存。 您还可以注册交易完成后的回调,并在事务边界之外更新缓存。 或者,如果您知道实体ID,则可以使用AuditReader.getRevisionsAuditQueryCreator查找最大修订版本号。

    由于您可以在事务处理过程中获取当前的修订版本号,因此,如果使用事务性缓存(例如Infinispan) ,甚至可以原子地更新全局缓存中的版本/修订版。

    当然,除了审计之外,所有这些仍然是Envers的主要目的:)

    参考: Adam Warski博客的Blog中来自JCG合作伙伴 Adam Warski的分代缓存和Envers


    翻译自: https://www.javacodegeeks.com/2012/07/generational-caching-and-envers.html

    envers

    展开全文
  • 主要介绍了Springboot hibernate envers使用过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • envers Spring Data JPA,Spring Security和Envers是我个人喜欢使用的库(我倾向于认为它们在各自的类别中被认为是同类中最好的)。 无论如何,我想实现一个我认为简单的用例:实体必须经过Envers审核,但是修订必须...
  • 这是一个使用Hibernate Envers,Spring boot和AngularJS的演示项目。 它旨在作为称为“四眼原理”( )的实际用例的解决方案。 此用例的主要参与者是“制造者”和“检查者”。 第一个将对特定业务对象进行更改,第二...
  • envers-validation-maven-plugin 这是一个Maven插件,用于验证由hibernate-envers生成/管理的审核修订的结构和内容。 此插件对表结构或内容并非始终由Envers生成的数据库特别有用。 例如,在数据库中,DBA有时会...
  • 针对某些实体类,要能查得到变化的历史痕迹。假如项目界面不需要考虑展示或可读性,只需要在数据库中入库变更版本,最简便且可靠的方式就是使用Hibernate envers他的部分配置及说明中文文档
  • Envers 上的简单应用程序现有应用程序是在 hibernate 3.5.0 上编写的,数据库连接到 SQL Server(数据库名称“test”)。 DB Config 记录在 hibernate-cfg.xml 中。 envers 的测试是用 HibernateTest.java 编写的
  • Envers概述

    千次阅读 2008-07-21 10:14:00
    Envers概述Envers项目目标是使翻译JPA持久类更容易。所有你需要做的是注释你的持久化类以及类的属性,用@Versioned。对于每个要翻译的实体(entity),会创建一个表。Envers会保存实体改变的历史。你还可以检索和...
  • Hibernate的Envers是准用于在数据库中国审计日志和保持数据多版本的Hibernate套件项目 启用Envers后,当在应用程序的主表中添加、修改和删除数据时,就会在单独的数据库表中自动存储数据的副本 Envers会侦听...
  • gw-data-jpa-envers-源码

    2021-04-21 07:43:18
    该项目是项目的扩展,允许访问由Hibernate Envers管理的实体修订版。 来源主要来自PhilippHügelmeyer 的贡献。 该模块的核心功能包括Spring Data Commons的RevisionRepository的实现。 public interface ...
  • JBoss Envers

    2008-11-14 13:05:33
    Envers目的是根据对实体的设置,提供记录执行数据变更历史的功能(数据变更版本)。Envers的配置非常简单,如果需要对某个实例进行历史数据版 本记录,只需要在实例上配置@Versioned annotation即可。 针对每个实体的...
  • 英文原文:...该项目是Spring Data JPA项目的扩展,允许访问由Hibernate Envers管理的实体修订。 消息来源主要来自PhilippHügelmeyer@hygl的贡献。 快速开始 使用Spring Initializr引导您的应用...
  • JPA配置装载 Jboss Envers Jasperreport ireport 项目源码 博文链接:https://neil-jh.iteye.com/blog/235838
  • 6 Hibernate:Envers 入门

    千次阅读 2017-06-26 21:17:34
    6 Hibernate:Envers 入门
  • hibernate-envers-4.2.4.Final.jar

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 436
精华内容 174
关键字:

Envers