gpt4 book ai didi

java - 为什么Hibernate会主动持久化一个对象?

转载 作者:行者123 更新时间:2023-11-30 04:22:58 26 4
gpt4 key购买 nike

我必须看看它的底部。这是一个简短的摘要:我有一个 Configuration 模型对象,其中包含一些配置设置以及用户名和密码。当然,密码是加密的,我必须解密才能使用它。实际上,我使用 Hibernate 加载 Configuration 对象(密码已加密),获取密码,解密它,并将密码属性设置为新评估的明文(我使用 setter 方法) 。请注意,我再也不会存储Configuration对象。奇怪的结果是我发现 CONFIGURATIONS 表用数据库中的密码明文更新!我猜想 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;
}
}

(可能没用)线索:自从我开始将 AOP 用于不同目的以来,我注意到了这种 Hibernate 行为。我看不出这两件事之间有明确的联系,但我还是报告了。我在项目中包含了这些库:

    <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>

最佳答案

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

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

编辑:有关一些背景信息,请参阅 hibernate docs ,特别是第 11.1 节 - hibernate 对象状态 - 您可以看到从 session 加载的对象处于持久状态,并且当工作单元完成时,更改将被持久化(即 session 处于持久状态)脸红了。

关于java - 为什么Hibernate会主动持久化一个对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16559004/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com