Hibernate envers审核具有加密列的表

Hibernate envers审核具有加密列的表,hibernate,spring-data-jpa,audit,hibernate-envers,Hibernate,Spring Data Jpa,Audit,Hibernate Envers,我们已经为我们的一个表实现了Hibernate envers audit(@audited),一切都如预期的那样正常工作。但在表中,我们使用对称密钥加密逻辑对一些字段进行加密,在实体中,我们包含了用于读写操作的@column传输 在这里,每当我们首先执行任何CRUD操作时,我们将编写一个本机查询来打开对称密钥,一旦CRUD操作完成,我们将关闭它。如果未打开对称密钥,则该值将为空。在我们的审计表中,除了那些被加密的列之外,每个值都被审计 所以根本原因是当hibernate创建一个查询以插入审计表时

我们已经为我们的一个表实现了Hibernate envers audit(@audited),一切都如预期的那样正常工作。但在表中,我们使用对称密钥加密逻辑对一些字段进行加密,在实体中,我们包含了用于读写操作的@column传输

在这里,每当我们首先执行任何CRUD操作时,我们将编写一个本机查询来打开对称密钥,一旦CRUD操作完成,我们将关闭它。如果未打开对称密钥,则该值将为空。在我们的审计表中,除了那些被加密的列之外,每个值都被审计

所以根本原因是当hibernate创建一个查询以插入审计表时,它没有打开对称密钥,因此值被存储为null

简而言之,在hibernate执行对审计表的任何插入之前,有没有办法打开对称密钥?一旦插入完成,密钥就需要关闭

我们在SpringJPA中使用HibernateEnvers版本5.0.12

@Entity
@Table(name = "CUSTOMER")
@Audited
public class Customer {
    @Id
    @GeneratedValue
    @Column(name = "CUSTOMER_ID")
    private long customerId;


    @Column(name = "USERNAME")
    private String userName;


    @Column(name = "FIRST_NAME")
    @ColumnTransformer(
            read = "CONVERT(VARCHAR(50), DecryptByKey(FIRST_NAME))",
            write = "EncryptByKey (Key_GUID('DBSymKey'), ?)")
    private byte[] firstName;

    @Column(name = "LAST_NAME")
    @ColumnTransformer(
            read = "CONVERT(VARCHAR(50), DecryptByKey(LAST_NAME))",
            write = "EncryptByKey (Key_GUID('DBSymKey'), ?)")
    private byte[] lastName;

}

你能在JPA事件监听器中做到这一点吗?你能为
org.hibernate.envers.boot.internal.AdditionalJaxbMappingProducerImpl
启用
trace
日志记录并用生成的HBM映射更新你的帖子吗?我怀疑HBM翻译中没有向ORM提供列转换器值;我仍然需要再次检查环境方是否正确处理了这个问题。您的HBM映射将非常有帮助,否则我将不得不在今天晚些时候在套件中设计一个测试用例以供查看。