当前位置: 首页 > 知识库问答 >
问题:

如何使用ValidityAuditStrategy批量插入到集合的审核表

颜思淼
2023-03-14

我正在使用HiberNate envers进行审计,我的大多数表都很好地执行批处理插入。然而,在我的一个实体上,我有一个经过审计的集合,它似乎不想批处理。

MyEntity:

@Entity
@DynamicUpdate
@Indexed(index = "aj")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ElementGroup {
  ...      
@ManyToMany(fetch = FetchType.LAZY, cascade = { CascadeType.PERSIST, CascadeType.DETACH, CascadeType.MERGE })
    @BatchSize(size = 30)
    @OrderBy("id ASC")
    @JoinTable(
            name = "element_groups",
            joinColumns = @JoinColumn(name = "group_id"),
            inverseJoinColumns = @JoinColumn(name = "member_id")
    )
    @Audited
    protected List<Element> members = new LinkedList<Element>();

(不确定这是否重要,我正在使用postgresql)。在日志中,我在一个循环中看到了1000条这样的语句

DEBUG 2021-11-07 15:28:56,673 [applicationInterfcePublishTaskExecuter-4::o.h.SQL.logStatement] [user:system] 
insert 
into
    nst_netobj_groups_aud
    (revtype, revend, rev, group_id, member_id) 
values
    (?, ?, ?, ?, ?)
DEBUG 2021-11-07 15:28:56,677 [applicationInterfcePublishTaskExecuter-4::o.h.SQL.logStatement] [user:system] 
    select
        nst_netobj0_.rev as rev1_137_,
        nst_netobj0_.group_id as group_id2_137_,
        nst_netobj0_.member_id as member_i3_137_,
        nst_netobj0_.revtype as revtype4_137_,
        nst_netobj0_.revend as revend5_137_ 
    from
        nst_netobj_groups_aud nst_netobj0_ 
    where
        nst_netobj0_.group_id=? 
        and nst_netobj0_.member_id=? 
        and (
            nst_netobj0_.revend is null
        ) for update
            of nst_netobj0_

在进行一些调试时,我了解到select for update语句会导致上一次插入的刷新,而不允许它们批处理。这句话似乎就是原因:

        final List<Object> l = qb.toQuery( session ).setLockOptions( LockOptions.UPGRADE ).list();

hibernate-envers-5.4.27.Final-sources.jar!/org/hibernate/envers/strategy/internal/ValidityAuditStrategy.java:328

我发现将刷新模式设置为手动/提交似乎没有帮助。有什么建议吗?

全堆栈跟踪:

    logStatement:125, SqlStatementLogger (org.hibernate.engine.jdbc.spi)
prepareStatement:170, StatementPreparerImpl$StatementPreparationTemplate (org.hibernate.engine.jdbc.internal)
prepareQueryStatement:151, StatementPreparerImpl (org.hibernate.engine.jdbc.internal)
prepareQueryStatement:2104, Loader (org.hibernate.loader)
executeQueryStatement:2041, Loader (org.hibernate.loader)
executeQueryStatement:2019, Loader (org.hibernate.loader)
doQuery:948, Loader (org.hibernate.loader)
doQueryAndInitializeNonLazyCollections:349, Loader (org.hibernate.loader)
doList:2850, Loader (org.hibernate.loader)
doList:2832, Loader (org.hibernate.loader)
listIgnoreQueryCache:2664, Loader (org.hibernate.loader)
list:2659, Loader (org.hibernate.loader)
list:506, QueryLoader (org.hibernate.loader.hql)
list:400, QueryTranslatorImpl (org.hibernate.hql.internal.ast)
performList:219, HQLQueryPlan (org.hibernate.engine.query.spi)
list:1414, SessionImpl (org.hibernate.internal)
doList:1625, AbstractProducedQuery (org.hibernate.query.internal)
list:1593, AbstractProducedQuery (org.hibernate.query.internal)
performCollectionChange:328, ValidityAuditStrategy (org.hibernate.envers.strategy.internal)
performCollectionChange:76, AuditStrategy (org.hibernate.envers.strategy)
perform:87, PersistentCollectionChangeWorkUnit (org.hibernate.envers.internal.synchronization.work)
executeInSession:125, AuditProcess (org.hibernate.envers.internal.synchronization)
doBeforeTransactionCompletion:164, AuditProcess (org.hibernate.envers.internal.synchronization)
doBeforeTransactionCompletion:47, AuditProcessManager$1 (org.hibernate.envers.internal.synchronization)
beforeTransactionCompletion:954, ActionQueue$BeforeTransactionCompletionProcessQueue (org.hibernate.engine.spi)
beforeTransactionCompletion:525, ActionQueue (org.hibernate.engine.spi)
beforeTransactionCompletion:2381, SessionImpl (org.hibernate.internal)
beforeTransactionCompletion:447, JdbcCoordinatorImpl (org.hibernate.engine.jdbc.internal)
beforeCompletionCallback:183, JdbcResourceLocalTransactionCoordinatorImpl (org.hibernate.resource.transaction.backend.jdbc.internal)
access$300:40, JdbcResourceLocalTransactionCoordinatorImpl (org.hibernate.resource.transaction.backend.jdbc.internal)
commit:281, JdbcResourceLocalTransactionCoordinatorImpl$TransactionDriverControlImpl (org.hibernate.resource.transaction.backend.jdbc.internal)
commit:101, TransactionImpl (org.hibernate.engine.transaction.internal)
doCommit:562, JpaTransactionManager (org.springframework.orm.jpa)
processCommit:743, AbstractPlatformTransactionManager (org.springframework.transaction.support)
commit:711, AbstractPlatformTransactionManager (org.springframework.transaction.support)
execute:152, TransactionTemplate (org.springframework.transaction.support)
lambda$publishApplicationInterfaceAsync$0:298, ApplicationInterfaceService (com.tufin.secureapp.service.interfaces)
run:-1, 16579879 (com.tufin.secureapp.service.interfaces.ApplicationInterfaceService$$Lambda$669)
runWorker:1149, ThreadPoolExecutor (java.util.concurrent)
run:624, ThreadPoolExecutor$Worker (java.util.concurrent)
run:748, Thread (java.lang)

共有1个答案

端木存
2023-03-14

我查过了,我发现了:

  • Chris在我担任Hibernate开发人员期间一直在做Envers的大部分修复工作,他在回复中说,目前没有解决办法

因此,在有人修复[HHH-14664]之前,唯一的选择是提供一个CustomValidityAuditStrategy,扩展ValidityAuditStrategy,并修复问题。

 类似资料:
  • 我使用Hibernate 4.0与envers 当我做更新或插入时,数据被保存到审计表中,模式为0和1 我想在插入后禁用审核。有人能告诉我如何禁用它吗。 我从4.0版本中读到了Hibernate,它会自动注册事件进行审计。 我想知道有什么方法可以禁用insert上的审核?

  • 问题内容: 我正在尝试使用Nest将多个记录插入数据库。使用IndexMany类插入确实可以,但是我还需要通过json字符串插入对象。 我确实在github上进行了查找,并找到了一些如何使用RAWclient的示例。在代码示例下面,我插入json。 一些其他信息: jsondata: var twitter: 我从数据库收到的结果: 有人知道这个问题可能是什么吗?还是我在json /代码中丢失了什

  • 本文向大家介绍如何执行批量插入?相关面试题,主要包含被问及如何执行批量插入?时的应答技巧和注意事项,需要的朋友参考一下 首先,创建一个简单的 insert 语句:   然后在 java 代码中像下面这样执行批处理插入:

  • 员工提交报销后,审批人可在PC端和企业APP上对报销进行审批。 PC端 1.审批人登陆滴滴企业版用车管理后台,进入侧边栏“审批”页面; 2.在“我的待审批”中,可查看员工提交的未审批报销,可通过限定时间、申请人等信息进行搜索; 3.点击欲审批行程右侧的“审批”按钮; 4.可点击“详情”查看该行程是否满足审批条件,根据实际情况点击“通过并转交”或“驳回”; 5.当所有审批人都通过时,报销申请成功。

  • 我试图在集合中插入一个对象,我重载了' 但我仍然得到以下错误: /home/joju/NetBeansProjects/cppu 1/main。cpp:51:对“domino::domino(int,int)”的未定义引用 build/Debug/GNU-Linux-x86/main。o:在函数`std::less::operator()(domino const)中 /usr/include/c

  • 问题内容: 我在使用Mongoskin在Node上执行批量插入(MongoDB 2.6+)时遇到麻烦。 上面的代码给出以下警告/错误: 是否可以使用Mongoskin执行无序批量操作?如果是这样,我在做什么错? 问题答案: 您可以执行此操作,但是您需要更改调用约定才能执行此操作,因为只有“回调”形式实际上会返回可以从其调用方法的集合对象。您认为此用法的方式也存在一些差异: 因此,实际的“批量”方法