gpt4 book ai didi

java - PreUpdate 回调中未修改字段值

转载 作者:太空宇宙 更新时间:2023-11-04 06:31:42 25 4
gpt4 key购买 nike

我已将以下类定义为默认实体监听器,因此每次调用 persist() 或 merge() 方法时,都会自动执行此代码:

public class StringProcessorListener {

@PrePersist
@PreUpdate
public void formatStrings(Object object) {
try {
for (Field f : object.getClass().getDeclaredFields()) {
if (f.getType().equals(String.class)) {
f.setAccessible(true);
if (f.get(object) != null) {
f.set(object, f.get(object).toString().toUpperCase());
}
}
}
} catch (Exception ex) {
Logger.getLogger(StringProcessorListener.class.getName()).log(Level.SEVERE, null, ex);
}
}
}

这样做的目的是在将对象插入数据库之前将其所有字符串大写。 @PrePersist 工作得很好,该方法修改了所有字符串,并将其大写保存在数据库中,但是当我尝试更新一个对象时,它效果不佳,该方法被正常调用,并且它也修改了字符串,但它不是将修改后的对象保存在数据库上,而是将对象保存为在此方法之前的状态。

关于如何解决这个问题有什么想法吗?

更新:

我使用DescriptorEvent解决了这个问题,它使我能够访问ObjectChangeSet,并且我可以手动更新它,然后将值正确保存在数据库中。

最佳答案

如果在服务器环境中运行或使用代理进行编织,出于性能原因,EclipseLink 将默认使用更改跟踪。如果是这样,直接在对象中设置值的方法将绕过编织的更改跟踪代码,因此 EclipseLink 不会意识到这些更改。 O 持久化,它直接使用对象中的所有值,而在更新时,它仅使用更改的字段,并且它只能通过更改跟踪监听器了解更改。您需要使用方法访问来设置这些字段,或者关闭更改跟踪: http://eclipse.org/eclipselink/documentation/2.5/jpa/extensions/a_changetracking.htm

关于java - PreUpdate 回调中未修改字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26045966/

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