使用Hibernate Envers,在执行创建操作时,审核功能正常工作,数据在主表和审核表中正确填写,但在删除少数字段的条目时,其取空,以下是代码示例:
@Audited
@MappedSuperclass
public abstract class A implements Serializable
{
private static final long serialVersionUID = 1L;
@NotNull
private Long id;
@NotNull
private String user;
private Timestamp time;
}
@Entity
@Audited
public class B extends A
{
private static final long serialVersionUID = 1L;
@EmbeddedId
private EmbeddedId embeddedId;
@ManyToOne
@JoinColumn(name = "CODE")
private Code code;
}
@Audited
@Embeddable
public class EmbeddedId implements Serializable
{
private static final long serialVersionUID = 1L;
@ManyToOne
@JoinColumn(name = "C") …Run Code Online (Sandbox Code Playgroud) 我有Hibernate的问题 - Envers.我有一个域对象只有一个审计属性status,可以是数字0,1,2,3,4,5之一.
@Entity
public class Item {
...
@Audited
private int status;
... other variables, setter/getter, ...
}
Run Code Online (Sandbox Code Playgroud)
现在,Envers和Hibernate中的所有东西都在工作.创建一个新的Item对象并将其添加到数据库中,将一行插入到Item_AUD数据库表中.
但现在我有更新它的问题.我在Hibernate Dao实现中的更新如下所示:
public void updateItem(Item i) {
SessionFactory sessionFac = HibernateUtility.getSessionFactory();
Session s = sessionFac.getCurrentSession();
Transaction trans = s.beginTransaction();
s.update(i);
s.flush();
trans.commit();
}
Run Code Online (Sandbox Code Playgroud)
在每次更新时,都会打印在我的控制台上:
Hibernate: update Item set amount=?, description=?, status=? where id=?
Hibernate: insert into REVINFO (REVTSTMP) values (?)
Hibernate: insert into Item_AUD (REVTYPE, status, id, REV) values (?, ?, ?, ?)
Run Code Online (Sandbox Code Playgroud)
但问题是,我只想插入一行REVINFO, …
我正在尝试使用Envers将更新/插入审核到我的表中。我已经在数据库中创建了扩展名为_AUDIT的审计表。
但是,当我实际运行该应用程序时,在审计表中看不到任何条目。我什至没有抛出任何错误或异常。条目被插入到主表中,但AUDIT表未更新。
这是我的ENVERS配置:
hibernate.cfg.xml:
<!-- Hibernate ENVERS Configuration -->
<property name="org.hibernate.envers.audit_table_suffix">_AUDIT</property>
<property name="org.hibernate.envers.revision_field_name">REVISION_ID</property>
<property name="org.hibernate.envers.revision_type_field_name">REVTYPE</property>
<property name="org.hibernate.envers.do_not_audit_optimistic_locking_field">true</property>
<property name="org.hibernate.envers.default_schema">ROCC</property>
<!-- Hibernate ENVERS Listener Configuration -->
<listener class="org.hibernate.envers.event.AuditEventListener" type="post-insert"/>
<listener class="org.hibernate.envers.event.AuditEventListener" type="post-update"/>
<listener class="org.hibernate.envers.event.AuditEventListener" type="post-delete"/>
<listener class="org.hibernate.envers.event.AuditEventListener" type="pre-collection-update"/>
<listener class="org.hibernate.envers.event.AuditEventListener" type="pre-collection-remove"/>
<listener class="org.hibernate.envers.event.AuditEventListener" type="post-collection-recreate"/>
Run Code Online (Sandbox Code Playgroud)
我的表如下:
/**
* Transaction generated by hbm2java
*/
@Audited
@Entity
@Table(name = "TRANSACTION", schema = "ROCC")
public class TransactionTable implements java.io.Serializable{...}
Run Code Online (Sandbox Code Playgroud)
审核表在同一架构中为TRANSACTION_AUDIT。
谁能告诉我为什么审计无效?
我在Tomcat环境中使用Hibernate Envers。工作正常。但是,我确实需要能够添加更改了要审核的数据的用户的用户名。这可以通过实现自己的RevisionEntity版本来实现。然后,您还必须实现一个定制RevisionListener,该定制将填充要审核的额外信息。我需要审核已更改要审核数据的用户名。在文档中,它是有关如何使用Seam进行操作的示例。在RevisionListener他们呼吁:
Identity identity = (Identity) Component.getInstance("org.jboss.seam.security.identity");
Run Code Online (Sandbox Code Playgroud)
获取用户名。在我的项目中,我们将项目分为数据库和Web的单独模块。我需要在数据库模块中实现我的custum修订版侦听器,以便能够获取当前登录的用户名。我不能将其RevisionListener移至Web包并从数据库模块引入对Web模块的依赖性。如何以一种处理在自定义RevisionListener中同时登录的多个用户的方式获取当前用户名?
最好的解决方案是可以在大多数容器中使用的解决方案。
我正在使用Hibernate Envers来审核我的实体和属性(org.hibernate.envers.global_with_modified_flag=true).这似乎有效,但现在我想得到一个特定实体的所有属性,与前一个相比,它在给定的修订版本中发生了变化.作为奖励,将变更集从一个修订版转换到另一个修订版会很好.到目前为止,我只获得修改过的实体:
List<Object> modifiedClassesAtRevision = getAuditReader().getCrossTypeRevisionChangesReader().findEntities(revision, RevisionType.MOD)
Object modifiedObject = modifiedClassesAtRevision.get(0);
Run Code Online (Sandbox Code Playgroud)
现在,因为我不想为Java中的所有实体创建比较方法,有没有办法获得此修订版的修改属性?有点像
List<String> modifiedProperties = getAuditReader().getModifiedProperties(modifiedObject, revision);
Run Code Online (Sandbox Code Playgroud)
会很高兴 - 但也许我太愚蠢而无法找到那种功能.
我刚刚开始使用Hibernate Envers进行审计,我想知道是否有办法在两个日期之间获得类的所有修订.
到目前为止我正在使用:
AuditQuery query = reader.createQuery().forRevisionsOfEntity(MYCLASS.class, false, true);
query.add(AuditEntity.revisionNumber().le(reader.getRevisionNumberForDate(MYDATE)));
Run Code Online (Sandbox Code Playgroud)
获取特定日期的修订,但有没有办法恢复所有修订,例如:MYDATE1和MYDATE2?
在审计表中,没有这样的标准可用于Criteria.setProjection(Projections.rowCount())获取查询的行数.
我们可以使用AuditQuery来做类似的事情.但在这种情况下我找不到如何设置预测.setProjectionAuditQuery 还有一个方法,但它AuditProjection作为参数.我能做类似的事情setProjection(rowCount)吗?
谢谢
我了解Envers会生成一个表来存储审计跟踪.是否可以手动分配我希望存储数据的表.而不是让Envers自己生成一个表?
我想用Dropwizard实现@Auditable。哪一个将创建* _audit表,并将详细信息与Revinfo表一起存储?
我正在将Dropwizard与Liquibase一起使用。
我在实体上添加了@Auditable
@Entity
@Table(name = "user_plan")
@Audited
public class UserPlan extends IdentityEntity
Run Code Online (Sandbox Code Playgroud)
并尝试更新抛出错误的表
! java.lang.AbstractMethodError: org.hibernate.envers.internal.synchronization.AuditProcessManager$2.doAfterTransactionCompletion(ZLorg/hibernate/engine/spi/SharedSessionContractImplementor;)V
! at org.hibernate.engine.spi.ActionQueue$AfterTransactionCompletionProcessQueue.afterTransactionCompletion(ActionQueue.java:975)
! at org.hibernate.engine.spi.ActionQueue.afterTransactionCompletion(ActionQueue.java:509)
! at org.hibernate.internal.SessionImpl.afterTransactionCompletion(SessionImpl.java:2472)
! at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.afterTransactionCompletion(JdbcCoordinatorImpl.java:479)
! at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.afterCompletionCallback(JdbcResourceLocalTransactionCoordinatorImpl.java:176)
! at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl.access$200(JdbcResourceLocalTransactionCoordinatorImpl.java:38)
! at org.hibernate.resource.transaction.backend.jdbc.internal.JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl.rollback(JdbcResourceLocalTransactionCoordinatorImpl.java:252)
! at org.hibernate.engine.transaction.internal.TransactionImpl.rollback(TransactionImpl.java:100)
! at io.dropwizard.hibernate.UnitOfWorkAspect.rollbackTransaction(UnitOfWorkAspect.java:144)
! at io.dropwizard.hibernate.UnitOfWorkAspect.onError(UnitOfWorkAspect.java:106)
! at io.dropwizard.hibernate.UnitOfWorkApplicationListener$UnitOfWorkEventListener.onEvent(UnitOfWorkApplicationListener.java:85)
! at org.glassfish.jersey.server.internal.monitoring.CompositeRequestEventListener.onEvent(CompositeRequestEventListener.java:71)
! at org.glassfish.jersey.server.internal.process.RequestProcessingContext.triggerEvent(RequestProcessingContext.java:226)
! at org.glassfish.jersey.server.ServerRuntime$Responder.process(ServerRuntime.java:472)
! at org.glassfish.jersey.server.ServerRuntime$2.run(ServerRuntime.java:334)
! at org.glassfish.jersey.internal.Errors$1.call(Errors.java:271)
! at org.glassfish.jersey.internal.Errors$1.call(Errors.java:267)
! at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
! at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
! at org.glassfish.jersey.internal.Errors.process(Errors.java:267)
! at …Run Code Online (Sandbox Code Playgroud) 在并行运行少量事务时,大多数情况下,我会陷入僵局:
------------------------
LATEST DETECTED DEADLOCK
------------------------
2019-09-04 06:19:12 0x2b01917c7700
*** (1) TRANSACTION:
TRANSACTION 14470484, ACTIVE 0 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 13 lock struct(s), heap size 1136, 7 row lock(s), undo log entries 4
MySQL thread id 69372, OS thread handle 47285779531520, query id 10366178979 172.31.19.11 master updating
update `VerificationActionLog_AUD` set `REVEND`=427956 where `id`=138136 and `REV`<> 427956 and `REVEND` is null
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS …Run Code Online (Sandbox Code Playgroud) hibernate-envers ×10
hibernate ×8
java ×4
mysql ×2
audit-tables ×1
auditing ×1
dropwizard ×1
jboss ×1
projection ×1