标签: hibernate-envers

在执行删除操作时,少数字段未经过审核,在保留在数据库中时其值为空

使用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)

java mysql jboss hibernate hibernate-envers

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

Hibernate - Envers - >属性的审计/版本控制,但仅限于值更改

我有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, …

hibernate hibernate-envers

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

使用hibernate.cfg.xml启用配置

我正在尝试使用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。

谁能告诉我为什么审计无效?

hibernate.cfg.xml hibernate-envers

5
推荐指数
0
解决办法
2045
查看次数

启用自定义修订侦听器

我在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中同时登录的多个用户的方式获取当前用户名?

最好的解决方案是可以在大多数容器中使用的解决方案。

java hibernate-envers

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

通过修订获取修改的属性

我正在使用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 auditing hibernate-envers

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

查询两个日期之间的所有Hibernate Envers修订版

我刚刚开始使用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?

java hibernate hibernate-envers

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

如何使用hibernate envers获取审计表的行数

在审计表中,没有这样的标准可用于Criteria.setProjection(Projections.rowCount())获取查询的行数.

我们可以使用AuditQuery来做类似的事情.但在这种情况下我找不到如何设置预测.setProjectionAuditQuery 还有一个方法,但它AuditProjection作为参数.我能做类似的事情setProjection(rowCount)吗?

谢谢

hibernate projection audit-tables hibernate-envers

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

手动为Hibernate Envers创建一个审计表

我了解Envers会生成一个表来存储审计跟踪.是否可以手动分配我希望存储数据的表.而不是让Envers自己生成一个表?

hibernate hibernate-envers

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

如何使用dropwizard实现@Auditable

我想用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)

java hibernate hibernate-envers dropwizard

5
推荐指数
0
解决办法
78
查看次数

如何解决由于休眠envers审计而导致的MySQL死锁?

在并行运行少量事务时,大多数情况下,我会陷入僵局:

------------------------
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)

mysql hibernate database-deadlocks hibernate-envers

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