标签: hibernate-envers

添加 OR 条件进行查询

我想知道如何OR向 Envers 标准 api添加条件:

    public IEnumerable<Guid> GetHistory(object id, params string[] props)
    {
        var auditQuery = AuditReaderFactory.Get(Session).CreateQuery()
            .ForRevisionsOfEntity(typeof(T), false, true);

        foreach (var prop in props)
        {
            auditQuery.Add(AuditEntity.RelatedId(prop).Eq(id)); // <-- adds AND, while OR is required!
        }

        return auditQuery
            .GetResultList<object[]>()
            .Select(i => ((T)i[0]).ID)
            .Distinct();
    }
Run Code Online (Sandbox Code Playgroud)

hibernate-envers nhibernate-envers

2
推荐指数
1
解决办法
1407
查看次数

CDI Beans 和 Hibernate Envers

我开始使用 Hibernate Envers。我已经能够使用 @Audited 正确注释类并创建修订版,但我无法用我的修订版记录已记录的用户数据。

我的 JSF 2.0 测试应用程序在 jbossEAP6/wildfly 服务器中的 CDI、JPA/Hibernate 上运行。我既不使用 Spring 也不使用 Seam。

这是一些代码:

修订实体.java

@Entity
@RevisionEntity(AuditListener.class)
public class RevisionEntity {
    @Id
    @GeneratedValue
    @RevisionNumber
    private int id;

    @RevisionTimestamp
    private long timestamp;

    private String username;
Run Code Online (Sandbox Code Playgroud)

登录Bean.java

@Named
@Stateful
@SessionScoped
public class LoginBean implements Serializable{

private String username;
...
Run Code Online (Sandbox Code Playgroud)

审计监听器

import javax.ejb.Stateful;
import javax.enterprise.context.SessionScoped;
import javax.inject.Inject;
import javax.inject.Named;

import org.hibernate.envers.RevisionListener;

import br.test.login.filterlogin.beans.LoginBean;

    @Named
    @Stateful
    @SessionScoped
    public class AuditListener implements RevisionListener {

        @Inject
        private LoginBean loginBean;

        public void newRevision(Object revisionEntity) …
Run Code Online (Sandbox Code Playgroud)

cdi hibernate-envers

2
推荐指数
1
解决办法
730
查看次数

Hibernare使用Spring数据JPA和Spring Boot来进行审计

我正在为我的项目使用Spring数据JPA和Spring Boot.

我有对象的审核要求(创建/更新/删除).我可能还需要获取特定对象的审核修订版.我已经在网上检查过Spring数据无法获得修订并且不跟踪删除?

所以我的问题是:

1)我们可以将Hibernate envers与Spring数据JPA集成吗?

2)我们有本机查询,HQL和Spring数据JPA更新/保存/删除动态查询,那么Hibernate envers能够跟踪所有对象吗?

由于我是审计新手,请告诉我上述问题.

谢谢.

hibernate auditing hibernate-envers spring-data-jpa spring-boot

2
推荐指数
2
解决办法
9807
查看次数

Hibernate Envers如何工作?

我在我的一个项目中使用Hibernate envers.它工作得非常好并且完成了这项工作.

我试图了解envers的内部工作机制.

  1. envers如何在内部工作?

  2. 当实际事务成功并且审计表更新失败时会发生什么?整个交易会被回滚吗?

  3. 是否在与提供请求的实际线程不同的线程中执行envers?或者可以吗?

java hibernate change-data-capture hibernate-envers audit-logging

2
推荐指数
1
解决办法
1586
查看次数

Hibernate Envers 与 QueryDSL 更新

Hibernate、Hibernate Envers 和 QueryDSL 在 Spring boot 中配置并正常工作1.4.1.RELEASE

问题是当使用UpdateClause<JPAUpdateClause> updateQueryBuilder = queryFactory.update(collectionTransaction);构建更新查询并执行该更新查询时,Hibernate Envers 不会拾取并审核这些更改。

以下是实现 QueryDSL 的 Spring Data JPA 存储库

public class CollectionTransactionRepositoryImpl extends QueryDslRepositorySupport implements CollectionTransactionRepositoryCustom {
    @Autowired
    private JPAQueryFactory queryFactory;

    public CollectionTransactionRepositoryImpl() {
        super(CollectionTransaction.class);
    }

    @Override
    public Collection<CollectionTransaction> updateCollectionTransaction(UpdateCollectionTransaction updateCollectionTransaction) {
        QCollectionTransaction collectionTransaction = QCollectionTransaction.collectionTransaction;
        UpdateClause<JPAUpdateClause> updateQueryBuilder = queryFactory.update(collectionTransaction);
        .....//Code omitted for brevity
        long updated = updateQueryBuilder.execute();
        //.....
        return ...
    }
}
Run Code Online (Sandbox Code Playgroud)

Hibernate Envers 有可能在这种情况下做出改变吗?

spring hibernate querydsl hibernate-envers spring-data-jpa

2
推荐指数
1
解决办法
2326
查看次数

envers审计表名称

我有一些与envers相关的天真问题.我们可以将审计表命名为默认值以外的其他值,即TableName_AUD和ya,而不仅仅是前缀或后缀,全名.

java hibernate-envers

1
推荐指数
1
解决办法
5703
查看次数

Hibernate Envers 获得标准的修订

使用 Hibernate Envers (4.1.9.Final)。尝试获取实体已更改为特定类型且符合特定标准的所有修订(日期、修订号)。

这是我目前拥有的代码:

    AuditReader auditReader = AuditReaderFactory.get(entityManager);
    AuditQuery query = auditReader.createQuery()
            .forRevisionsOfEntity(InventoryItem.class, false, true)
            .add(AuditEntity.property("section_uuid").eq(sectionUuid))
            .addOrder(AuditEntity.revisionNumber().desc());
    List<Object[]> revisions = query.getResultList();
Run Code Online (Sandbox Code Playgroud)
  1. 这将为每个更改返回一个元素InventoryItem。因此,如果InventoryItem在修订版中更改了两个s,我会得到两个元素——我不想要那样。
  2. 这也会返回实际的InventoryItems,我认为这有点沉重——我不想要那样。

如何获得不同的修订集合(日期、修订号)?

java hibernate hibernate-envers

1
推荐指数
1
解决办法
4498
查看次数

EnversRevisionRepositoryFactoryBean不为JPARepository创建bean

我使用的是弹簧靴,冬眠相反。我在pom.xml中具有以下依赖性

<dependency>
  <groupId>org.springframework.data</groupId>
  <artifactId>spring-data-envers</artifactId>
</dependency>
Run Code Online (Sandbox Code Playgroud)

以下是我的envers配置。

@Configuration
@EnableJpaRepositories(repositoryFactoryBeanClass = 
EnversRevisionRepositoryFactoryBean.class, basePackages = { 
"com.example.persistence" })
public class EnversConf
{

}
Run Code Online (Sandbox Code Playgroud)

因此,包com.example.persistence具有PersonDAOAddressDAO实体。

我有两个DAO,

interface PersonDAO  extends RevisionRepository<PersonEntity, Integer, Integer>, JpaRepository<PersonEntity, Integer>{}

interface AddressDAO  extends JpaRepository<AddressEntity, Integer>{}
Run Code Online (Sandbox Code Playgroud)

我有两个PersonEntity要审核的实体,而我不想AddressEntity审核。

现在,我有以下两项服务,

class PersonServiceImpl implements PersonService{
    @Autowire PersonDAO personDAO;
}

class AddressServiceImpl implements AddressService{
    @Autowire AddressDAO addressDAO;
}
Run Code Online (Sandbox Code Playgroud)

当我添加@EnableJpaRepositories(...)配置时,它无法获取bean AddressDAO。我认为EnversRevisionRepositoryFactoryBean对... RevisionRepositoryJpaRepository

我得到了异常堆栈跟踪,

org.springframework.beans.factory.UnsatisfiedDependencyException:创建名称为“ addressService”的bean时出错:通过字段“ addressDAO”表示的不满足的依赖关系;嵌套的异常是org.springframework.beans.factory.BeanCreationException:创建名称为'addressDAO'的bean时出错:调用init方法失败;嵌套的异常是org.springframework.data.mapping.PropertyReferenceException:没有找到类型为AddressEntity的属性findAll!

由以下原因引起:org.springframework.beans.factory.BeanCreationException:创建名称为'addressDAO'的bean时出错:调用init方法失败;嵌套的异常是org.springframework.data.mapping.PropertyReferenceException:没有找到类型为AddressEntity的属性findAll!

由以下原因引起:org.springframework.data.mapping.PropertyReferenceException:没有找到类型AdressEntity的属性findAll! …

hibernate-envers spring-boot spring-data-envers

1
推荐指数
1
解决办法
858
查看次数

Hibernate 在 Spring 应用程序中实现性能和事务管理

在我们的 SpringBoot 项目(使用 Spring MVC、Spring Data 等)中,我们使用 Hibernate Envers 来审计我们的数据库记录。有几件事我不确定。

1- 性能 - 线程:

假设我有一个经过审计的 Person 实体。当我在相关表中插入/更新新的 Person 记录时,这对我的应用程序的性能有何影响?客户是否必须等待所有环境审计完成?Envers 会在一个单独的线程中处理这个问题吗?一旦插入成功,那么客户就可以继续他一直在做的任何任务?或者所有审计都在一个线程中处理,客户端应用程序将不得不等待所有审计记录完成?

2- 性能 - 缓存并执行:

Envers 是否缓存所有审计处理并在稍后执行?我的意思是在所有录音都完成之后。

3- 交易管理:

事务管理怎么样。假设我已成功为 Person 实体创建了一条记录,但是在尝试创建审计记录时出现错误。那会发生什么?这会回滚 Person 实体数据的记录吗?

4-分布式事务管理:

分布式事务环境怎么样?您将如何确保分布式事务环境中 envers 审计记录的一致性?你有没有遇到过类似的情况,如果有问题,你是如何解决的?

您在使用 Envers 时遇到了哪些问题(如果有的话)。您应用了哪些替代审计方法?

请不要只提供链接并说“阅读此内容”。告诉我你所知道的和你所经历的。

非常感谢!

hibernate hibernate-envers

1
推荐指数
1
解决办法
1654
查看次数

什么是JPA配置?

很难尝试让一个简单的Envers示例工作.我坚持org.hibernate.tool.ant.EnversHibernateToolTask- 看起来我终于得到了我需要的所有jar文件,但现在我收到了错误信息

[hibernatetool] Persistence unit not found: 'ConsolePU'.

BUILD FAILED
C:\deka\proj\java\test-database\build.xml:61: Persistence unit not found: 'ConsolePU'.
Run Code Online (Sandbox Code Playgroud)

据我所知,持久性单元与JPA persistence.xml文件相关联.但我没有使用persistence.xml文件; 我正在使用hibernate.cfg.xml - 但是envers示例<jpaconfiguration>在ant任务中有一个:

<hibernatetool destdir=".">
        <classpath>
             <fileset dir="src/">
                  <include name="**/*.hbm.xml"/>
            </fileset>

            <path location="${buildDir}" />
        </classpath>
    <jpaconfiguration persistenceunit="ConsolePU" />
    <hbm2ddl
        drop="false"
        create="true"
        export="false"
        outputfilename="versioning-ddl.sql"
        delimiter=";"
        format="true"/>
    </hibernatetool>
Run Code Online (Sandbox Code Playgroud)

有什么东西我可以替换它以使其与hibernate.cfg.xml文件一起使用?似乎有关于如何使所有这些东西正常工作的ZERO文档.

编辑:好的,所以主要的问题是我不明白hibernatetool选项以及什么适合我的应用程序.幸运的是,我确实找到了Hibernate ant docs.谢谢.现在我遇到了一个新问题:我正在使用注释,但我也为属性设置设置了hibernate.cfg.xml.该hibernatetool任务只让我跑任一<configuration /><annotationconfiguration />不同时,甚至<configuration />是行不通的,因为我已经有注释做的事情.如何将我的属性设置从hibernate.cfg.xml文件迁移到我的注释?

编辑: Duh,我没有意识到你只是这样做:

<annotationconfiguration configurationfile="...filename..." />
Run Code Online (Sandbox Code Playgroud)

根据hibernatetool任务文档.

java ant hibernate jpa hibernate-envers

0
推荐指数
2
解决办法
5232
查看次数

org.hibernate.envers.event.AuditEventListener.generateBidirectionalCollectionChangeWorkUnits(...)中的NullPointerException

我正在使用Envers审核我的实体的不同字段.该框架通常起作用,但似乎在某些类型的实体映射中存在问题.所有以前的问题我都可以自己解决......但这次我被困住了.

将某个实体插入数据库时​​,我得到以下异常:

Caused by: java.lang.NullPointerException
    at org.hibernate.envers.event.AuditEventListener.generateBidirectionalCollectionChangeWorkUnits(AuditEventListener.java:108)
Run Code Online (Sandbox Code Playgroud)

我不完全确定哪个实体导致这种情况,因为它在flush()期间被触发,并且复杂的应用程序在一个较大的事务中插入许多不同的实体.

我们正在使用一些在该异常之前触发的HibernateEventListener ...所以我认为该实体是原因.persistence.xml以这种方式配置:

        <property name="hibernate.ejb.event.post-insert" value="com.xyz.hibernate.events.listeners.MyListener,org.hibernate.envers.event.AuditEventListener" />
Run Code Online (Sandbox Code Playgroud)

如果这是真的,则实体如下(摘录):

@Entity
@Table(name = Property.TABLE_NAME, uniqueConstraints = @UniqueConstraint(columnNames = { "ENTITY_ID", "DESCRIPTOR_ID", "PROMOLEVEL_ID" }))
public class Property extends AbstractEntity {
private static final long serialVersionUID = 1L;

public static final String TABLE_NAME = "E_BUSINESS_PROPERTIES";
public static final String PROPERTY_ENTITY = "entity";
public static final String PROPERTY_DESCRIPTOR = "descriptor";
public static final String PROPERTY_PROMOLEVEL = "promolevel";

@Audited
@ManyToOne(optional = false)
private ProjectPropertyDescriptor descriptor;

@Audited
@ManyToOne
private ExtendedEntity …
Run Code Online (Sandbox Code Playgroud)

java hibernate hibernate-envers

0
推荐指数
1
解决办法
2548
查看次数

Spring 3.x和Hibernate Envers

我在让Hibernate Envers在我们的环境中工作时遇到了问题.我们使用Spring 3.x和LoadTimeWeaving.以下是我们的上下文文件:

<context:annotation-config/>
<context:spring-configured/>
<context:load-time-weaver aspectj-weaving="autodetect"/>
<context:component-scan base-package="com.viridityenergy.vpower"/>
<context:property-placeholder location="classpath:db/database-test.properties"/>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>

<bean id="dataSourcePooled"
    class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close"
    p:jdbcUrl="${database.url}"
    p:user="${database.username}"
    p:password="${database.password}"
    p:initialPoolSize="1"
    p:maxPoolSize="5"
    p:idleConnectionTestPeriod="500"
    p:acquireIncrement="1"
    p:maxStatements="50"
    p:numHelperThreads="1"
    p:autoCommitOnClose="true"/>

<bean id="jpaAdapter"
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"
    p:databasePlatform="${database.platform}"
    p:showSql="${database.showSql}"
    p:generateDdl="${database.generateDdl}"/>

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    p:persistenceUnitName="TEST"
    p:persistenceXmlLocation="META-INF/persistence.xml"
    p:dataSource-ref="dataSourcePooled"
    p:jpaVendorAdapter-ref="jpaAdapter">

  <property name="loadTimeWeaver">
    <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
  </property>
</bean>

<bean id="transactionManager"
    class="org.springframework.orm.jpa.JpaTransactionManager"
    p:entityManagerFactory-ref="entityManagerFactory"
    p:dataSource-ref="dataSourcePooled"/>

<tx:annotation-driven transaction-manager="transactionManager"/>

<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>
Run Code Online (Sandbox Code Playgroud)

这是我们的persistence.xml

<persistence-unit name="TEST" transaction-type="RESOURCE_LOCAL">

  <provider>org.hibernate.ejb.HibernatePersistence</provider>

  <properties>
    <property name="hibernate.ejb.event.post-insert"
            value="org.hibernate.envers.event.AuditEventListener"/>

    <property name="hibernate.ejb.event.post-update"
            value="org.hibernate.envers.event.AuditEventListener"/>

    <property name="hibernate.ejb.event.post-delete"
            value="org.hibernate.envers.event.AuditEventListener"/>

    <property name="hibernate.ejb.event.pre-collection-update"
            value="org.hibernate.envers.event.AuditEventListener"/>

    <property name="hibernate.ejb.event.pre-collection-remove"
            value="org.hibernate.envers.event.AuditEventListener"/> …
Run Code Online (Sandbox Code Playgroud)

java spring hibernate-envers

0
推荐指数
1
解决办法
3202
查看次数

Hibernate Envers性能MySQL

现在,我正在尝试选择最合适的方法,以便为使用AWS RDS MySQL数据库的实体实现Audit Trail.

我必须记录所有实体更改,包括发起这些更改的发起者(用户).其中一个主要标准是表现.

Hibernate Envers看起来是最简单,最完整的解决方案,可以快速集成.现在我担心Envers推出后可能出现性能下降.我看到一些帖子,开发人员更喜欢基于数据库触发器的Audit Trail方法.

触发器的主要问题是如何获得发起这些更改的发起者(用户).

根据您的经验,您是否可以建议Java/Spring/Hibernate/MySQL(AWS)的方法,以便为历史更改实现Audit Trail.

另外,我们在AWS RDS MySQL数据库基础架构中是否有任何Audit Trail解决方案?

mysql spring hibernate amazon-web-services hibernate-envers

0
推荐指数
1
解决办法
844
查看次数