我必须看到底部。这是一个简短的摘要:我有一个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>
答案 0 :(得分:2)
当您使用hibernate加载对象时,该实例将绑定到您加载它的会话,并跟踪对它的所有更改。当会话最终被刷新时(调用适当的方法或由于会话行为的FlushMode选择而在内部),更改将同步到db。
要么不更改您加载的对象,要么将未加密的密码存储在例如非持久属性,或调用逐出将其从会话中分离。
编辑:有关某些背景信息,请参阅hibernate docs,特别是第11.1节 - 休眠对象状态 - 您可以看到从会话加载的对象位于持久状态,并且当工作单元完成时(即刷新会话时)保持更改。