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
尝试读取加密文本时JPA/Hibernate出现OptimisticLockException_Hibernate_Jpa_Encryption_Jasypt - Fatal编程技术网

尝试读取加密文本时JPA/Hibernate出现OptimisticLockException

尝试读取加密文本时JPA/Hibernate出现OptimisticLockException,hibernate,jpa,encryption,jasypt,Hibernate,Jpa,Encryption,Jasypt,我们需要在用JPA存储字符串时对其进行加密,在读取字符串时对其进行解密。首先,我们不能使用一些hibernate配置或任何其他配置文件,因为我们的属性是通用的。这意味着我们的属性如下所示(简单地说,我们已经在这里实现了一些处理): (我们可以通过isEncrypted()方法区分必须加密的属性。这取决于属性设置为true或false)。Out Encryptor class(简化版)适用于Jasypt: public final class MyEncrypter { private s

我们需要在用JPA存储字符串时对其进行加密,在读取字符串时对其进行解密。首先,我们不能使用一些hibernate配置或任何其他配置文件,因为我们的属性是通用的。这意味着我们的属性如下所示(简单地说,我们已经在这里实现了一些处理):

(我们可以通过isEncrypted()方法区分必须加密的属性。这取决于属性设置为true或false)。Out Encryptor class(简化版)适用于Jasypt:

public final class MyEncrypter
{
    private static final String password = "AHKG@a4SjHH5%j%974";
    private static final StandardPBEStringEncryptor encryptor;

    static 
    {
        encryptor = new StandardPBEStringEncryptor();
        encryptor.setPassword(password);
    }

    public final static String encrypt(String string)
    {
           return encryptor.encrypt(string);
    }

        public final static String decrypt(String encrypted)
        {
            return encryptor.decrypt(encrypted);
        }
}
加密/解密工作正常。实际上,我们的整个持久性处理工作。我们可以保存加密数据。但是,当我们读取加密数据时,会得到以下结果:

javax.persistence.OptimisticLockException: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [at.jit.remind.jee.domain.context.model.Property#10]
奇怪的是,只有当且仅当Hibernates尝试更新加密的文本时,才会发生这种情况。但当我们对文本进行伪加密和伪解密时,这种情况不会发生。这意味着我们反转文本,用Hibernate存储反转后的文本,并在Hibernate尝试更新时对其进行“解密”。所以我们的整个处理都是有效的,但是当我们使用“真正的”加密时,它不起作用的原因是什么呢?有什么想法吗


(同样,en-and-decryption本身也可以工作。我让它在不同的JUnit类中运行以确保这一点。)

这是因为您的对象仍然连接到hibernate会话,并且其内部状态已更改。请尝试先调用session.execute(object),然后更改要加密的文本。

我们决定使用另一种加密,因为jasypt显然会执行一些奇怪的休眠操作。这种加密/解密似乎会在某种程度上为Hibernate生成一个“脏标志”,因此Hibernate会尝试更新数据库条目,尽管encrytion会同时更改值。无法将其隔离。

谢谢您的回答,但我们无法使用会话,因为我们有JPA的EntityManager。此外,这并不能解释为什么它与我们的“伪”加密/解密一起工作。
javax.persistence.OptimisticLockException: org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [at.jit.remind.jee.domain.context.model.Property#10]