为什么Hibernate会坚持自己主动的对象?

时间:2013-05-15 07:18:11

标签: java hibernate

我必须看到底部。这是一个简短的摘要:我有一个Configuration模型对象,它有一些配置设置以及用户名和密码。当然,密码是加密的,我必须解密才能使用它。实际上,我使用Hibernate加载Configuration对象(密码被加密),我获取密码,我解密它,并将密码属性设置为新评估的明文(我使用setter方法)。请注意,我再也不会存储Configuration对象。奇怪的结果是我发现CONFIGURATIONS表更新了db中的密码明文!我想Hibernate缓存系统在神秘中起了作用,但我必须理解为什么如何

以下详细信息:

我使用Spring框架,版本3.1.2 RELEASE

servlet.xml中

    <!-- HIBERNATE -->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>4.0.0.Final</version>
    </dependency>

服务

@Service("configurationManager")
public class ConfigurationManager {

    //attributes and blah blah

    public Configuration loadConfiguration()
    {
        //the Configuration's password attribute is encrypted in the db
        Configuration configuration = configurationDao.load();
        if(configuration!=null)
        {
            //...to use the password I must decrypt it
            if(!(configuration.getPassword()==null || configuration.getPassword().isEmpty()))
            {                   
                String encryptedText = configuration.getPassword();
                String decryptedText = credentialsManager.decrypt(encryptedText);
                //after decrypting the password, I set the Configuration's password attribute to the plaintext password
                //I'll never ever store the Configuration obj with the newly set password.
                configuration.setPassword(decryptedText);
            }
        }
        return configuration;
    }   
}

(也许没用)线索:我注意到这种Hibernate行为,因为我开始使用AOP用于不同的目的。我看不出这两件事之间有明确的联系,但无论如何我都要报告。我在项目中包含了这些库:

    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjrt</artifactId>
        <version>1.7.2</version>
    </dependency>
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.7.2</version>
    </dependency>   

1 个答案:

答案 0 :(得分:2)

当您使用hibernate加载对象时,该实例将绑定到您加载它的会话,并跟踪对它的所有更改。当会话最终被刷新时(调用适当的方法或由于会话行为的FlushMode选择而在内部),更改将同步到db。

要么不更改您加载的对象,要么将未加密的密码存储在例如非持久属性,或调用逐出将其从会话中分离。

编辑:有关某些背景信息,请参阅hibernate docs,特别是第11.1节 - 休眠对象状态 - 您可以看到从会话加载的对象位于持久状态,并且当工作单元完成时(即刷新会话时)保持更改。