从hibernate envers获取审计表名称?

时间:2018-02-16 13:06:53

标签: java hibernate hibernate-envers auditing

是否可以从Hibernate envers为实体请求审计表的名称?我并不是指为实体获取Hibernate表名并附加审计后缀的解决方案。

1 个答案:

答案 0 :(得分:0)

在Hibernate Envers 5.x中,没有集中的方式来获取此信息,因此您必须查阅多个API才能获取此元数据。但是HHH-12014HHH-12044强调了公开此功能的必要性,以便用户代码可以更轻松地使用它。

为了获得对这些信息的访问权限,我们首先需要获得一些仅通过SessionImplementor接口提供的SPI。

我必须强调这种方法可以随每个版本而改变,因为其中一些使用的内部类和方法不受小版本和错误修复版本的兼容性限制

使用JPA

SessionImplementor si = entityManager.unwrap( SessionImplementor.class );

使用Native Hibernate

SessionImplementor si = (SessionImplementor) session;

获得SessionImplementor后,我们需要访问一些内部对象:

// Get the envers service, this is the central "holder" for envers in 5.x
EnversService enversService = si.getSessionFactory()
    .getServiceRegistry()
    .getService( EnversService.class );

// Next we get the audit entity configuration and get the audited entity name
AuditEntitiesConfiguration aec = enversService.getAuditEntitiesConfiguration();
String auditEntityName = aec.getAuditEntityName( yourEntityName );

// Now we need to get the entity information from ORM
EntityPersister persister = si.getSessionFactory().getEntityPersister( auditEntityName )
String tableName = ( (Queryable) persister ).getTableName();