Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate Envers-支持ValidityAuditStrategy中的JDBC批处理,允许\标识符\重用=true_Java_Hibernate_Hibernate Envers - Fatal编程技术网

Java Hibernate Envers-支持ValidityAuditStrategy中的JDBC批处理,允许\标识符\重用=true

Java Hibernate Envers-支持ValidityAuditStrategy中的JDBC批处理,允许\标识符\重用=true,java,hibernate,hibernate-envers,Java,Hibernate,Hibernate Envers,使用Hibernate+Envers(版本5.2.17.Final),我试图保存大约250000个JPA实体,并使用EnversValidityAuditStrategy审核初始插入。我使用JDBC批处理来提高性能。我看到这两种方法都在进行批处理 插入到基表(即,插入到dbo中。示例\u表) 插入到审核表(即,插入到dbo。示例\u table\u AUD) 但不适用于用于更新任何以前审核行的结束修订的查询,我认为在设置allow\u identifier\u reuse=true时启用了该

使用Hibernate+Envers(版本5.2.17.Final),我试图保存大约250000个JPA实体,并使用Envers
ValidityAuditStrategy
审核初始插入。我使用JDBC批处理来提高性能。我看到这两种方法都在进行批处理

  • 插入到基表(即,
    插入到dbo中。示例\u表
  • 插入到审核表(即,
    插入到dbo。示例\u table\u AUD
但不适用于用于更新任何以前审核行的结束修订的查询,我认为在设置
allow\u identifier\u reuse=true时启用了该查询(这对于我的用例是必需的)。这些更新查询之一的示例:

update
    dbo.example_table_aud
set
    revend=? 
where
    id=? 
    and rev<> ? 
    and revend is null
休眠/环境配置:

  org.hibernate.envers:
    audit_table_suffix: _AUD
    revision_field_name: REV
    revision_type_field_name: REVTYPE
    default_schema: dbo
    audit_strategy: org.hibernate.envers.strategy.ValidityAuditStrategy
    do_not_audit_optimistic_locking_field: false
    store_data_at_delete: true
    allow_identifier_reuse: true
  hibernate:
    dialect: org.hibernate.dialect.SQLServer2012Dialect
    format_sql: true
    jdbc.batch_size: 100
    jdbc.batch_versioned_data: true
    order_inserts: true
    order_updates: true

是否有一种解决方法,可以在查询中使用JDBC批处理来更新以前任何行的结束修订?

您提到的更新有以下几个原因:

  • 标识符重用(这实际上只对REV_TYPE=0或
    RevisionType.ADD
    行重要)
  • REV_类型!=0(又名
    RevisionType.MOD
    RevisionType.DEL
    行)
  • 目前还没有真正的解决方法来批量处理这些语句,这主要是因为这些更新的工作方式。现有的策略期望这些谓词影响表中的一行,因此也会检查该行,作为其健全性检查的一部分,否则我们会强制事务失败

    我认为找到一种方法来实现这一点会很好,这样批插入/更新就可以工作了,但我们首先必须找到一种方法来实现这些更新,并保持相同的健全性检查,其中只有一行会受到该更改的影响,而不是多行(如果更改被延迟的话)

    所有这些;所有这些逻辑都在
    ValidityAuditStrategy
    中处理,这是用户的一个可插拔选项,因此您可以找到一个可行的解决方案,与我们共享

    在任何一种情况下,我都会建议与我们讨论JIRA增强问题,我们可以更详细地讨论如何(如果可能的话)更好地处理可能支持的批插入/更新

      org.hibernate.envers:
        audit_table_suffix: _AUD
        revision_field_name: REV
        revision_type_field_name: REVTYPE
        default_schema: dbo
        audit_strategy: org.hibernate.envers.strategy.ValidityAuditStrategy
        do_not_audit_optimistic_locking_field: false
        store_data_at_delete: true
        allow_identifier_reuse: true
      hibernate:
        dialect: org.hibernate.dialect.SQLServer2012Dialect
        format_sql: true
        jdbc.batch_size: 100
        jdbc.batch_versioned_data: true
        order_inserts: true
        order_updates: true