我想知道如何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。我已经能够使用 @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) 我正在为我的项目使用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
我在我的一个项目中使用Hibernate envers.它工作得非常好并且完成了这项工作.
我试图了解envers的内部工作机制.
envers如何在内部工作?
当实际事务成功并且审计表更新失败时会发生什么?整个交易会被回滚吗?
是否在与提供请求的实际线程不同的线程中执行envers?或者可以吗?
java hibernate change-data-capture hibernate-envers audit-logging
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 有可能在这种情况下做出改变吗?
我有一些与envers相关的天真问题.我们可以将审计表命名为默认值以外的其他值,即TableName_AUD和ya,而不仅仅是前缀或后缀,全名.
使用 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)
InventoryItem。因此,如果InventoryItem在修订版中更改了两个s,我会得到两个元素——我不想要那样。InventoryItems,我认为这有点沉重——我不想要那样。如何获得不同的修订集合(日期、修订号)?
我使用的是弹簧靴,冬眠相反。我在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具有PersonDAO和AddressDAO实体。
我有两个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对... RevisionRepository和JpaRepository。
我得到了异常堆栈跟踪,
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! …
在我们的 SpringBoot 项目(使用 Spring MVC、Spring Data 等)中,我们使用 Hibernate Envers 来审计我们的数据库记录。有几件事我不确定。
1- 性能 - 线程:
假设我有一个经过审计的 Person 实体。当我在相关表中插入/更新新的 Person 记录时,这对我的应用程序的性能有何影响?客户是否必须等待所有环境审计完成?Envers 会在一个单独的线程中处理这个问题吗?一旦插入成功,那么客户就可以继续他一直在做的任何任务?或者所有审计都在一个线程中处理,客户端应用程序将不得不等待所有审计记录完成?
2- 性能 - 缓存并执行:
Envers 是否缓存所有审计处理并在稍后执行?我的意思是在所有录音都完成之后。
3- 交易管理:
事务管理怎么样。假设我已成功为 Person 实体创建了一条记录,但是在尝试创建审计记录时出现错误。那会发生什么?这会回滚 Person 实体数据的记录吗?
4-分布式事务管理:
分布式事务环境怎么样?您将如何确保分布式事务环境中 envers 审计记录的一致性?你有没有遇到过类似的情况,如果有问题,你是如何解决的?
您在使用 Envers 时遇到了哪些问题(如果有的话)。您应用了哪些替代审计方法?
请不要只提供链接并说“阅读此内容”。告诉我你所知道的和你所经历的。
非常感谢!
我很难尝试让一个简单的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)
我正在使用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) 我在让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) 现在,我正在尝试选择最合适的方法,以便为使用AWS RDS MySQL数据库的实体实现Audit Trail.
我必须记录所有实体更改,包括发起这些更改的发起者(用户).其中一个主要标准是表现.
Hibernate Envers看起来是最简单,最完整的解决方案,可以快速集成.现在我担心Envers推出后可能出现性能下降.我看到一些帖子,开发人员更喜欢基于数据库触发器的Audit Trail方法.
触发器的主要问题是如何获得发起这些更改的发起者(用户).
根据您的经验,您是否可以建议Java/Spring/Hibernate/MySQL(AWS)的方法,以便为历史更改实现Audit Trail.
另外,我们在AWS RDS MySQL数据库基础架构中是否有任何Audit Trail解决方案?