我正在使用 spring boot 和 spring 数据 jpa。我也在使用 hibernate envers,我需要访问 AuditReaderFactory 以便我可以编写审计查询。
因为它是一个弹簧引导和弹簧数据 jpa,所以一切都是自动配置的。所以当我这样做时,
@Autowired
AuditReaderFactory auditReaderFactory;
Run Code Online (Sandbox Code Playgroud)
它不起作用。我收到以下错误。
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type [org.hibernate.envers.AuditReaderFactory] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency
Run Code Online (Sandbox Code Playgroud)
如何在我的存储库类中正确引用 AuditReaderFactory?
我们有一个已经投入生产的应用程序,它正在使用 Envers 进行审计。
现在我们将发布一个更新,我们将在其中审核一种新的实体。然而,这个实体已经存在于生产环境中,只是到目前为止还没有被审计。
我们已经在包含现有记录的测试环境中进行了尝试,但它在保存时崩溃,因为 Envers 找不到正在保存的实体的先前修订版。
解决这个问题的方法是什么?
例如,如果可以指定对实体进行审计的日期,那就太好了。
我正在使用NHibernate Envers 1.6.0并且需要使用UTC时间戳而不是本地REVINFO中的REVTSTMP列.
我知道已经报告了这个bug(NHE-122)并且已经修复了未来的2.0版本
有什么办法可以将DefaultRevisionInfoGenerator更改为我自己的自定义IRevisionInfoGenerator吗?
我想知道如何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) 我正在尝试在来自 nhibernate envers 的修订实体和包含用户名的列表之间执行连接。我想返回一个命名元组列表。
这是我的代码
public IEnumerable<(Societa company, DateTime datetime, string userName)> CompanyHistory()
{
IAuditReader auditReader = this._session.Auditer();
var revison = auditReader.CreateQuery().ForHistoryOf<Societa, RevisionEntity>().Results();
IList<Persona> user = _session.QueryOver<Persona>().List();
var query = revison.Join(user,
rev => rev.RevisionEntity.IdUtente,
us => us.Id,
(rev, us) => new
{
Oggetto = rev.RevisionEntity,
DataModifica = rev.RevisionEntity.RevisionDate.ToLocalTime(),
NomeUtente = us.NomePersona
}).ToList();
}
Run Code Online (Sandbox Code Playgroud)
但现在我没有找到返回元组的方法
我也试试
(ele, p) => new (OutputGA Oggetto, DateTime DataModifica, string NomeUtente)
{
Oggetto = ele.RevisionEntity,
DataModifica = ele.RevisionEntity.RevisionDate.ToLocalTime(),
NomeUtente = p.NomePersona
}).ToList();
Run Code Online (Sandbox Code Playgroud)
但我得到了 …