我在 Wildfly 26 中使用 Hibernate 5.3.24 并增强了字节码以支持延迟加载 ToOnes 和 hibernate.enable_lazy_load_no_trans=true(我知道这是一种代码味道)。
我正在尝试使用 PostUpdateEventListener 记录对属性的更改:
public void onPostUpdate(PostUpdateEvent event)
throws HibernateException {
Object entity = event.getEntity();
String[] properties = event.getPersister().getPropertyNames();
for (int i : event.getDirtyProperties()) {
Object oldValue = event.getOldState()[i];
Object newValue = event.getState()[i];
if (!(newValue instanceof PersistentCollection )) {
log.debug("property: " + properties[i]
+ " has changed from " + oldValue
+ " class: " + (oldValue == null ? "NULL" : oldValue.getClass())
+ " to " + newValue
+ " class: " + (newValue == null ? "NULL" : newValue.getClass()));
// Logging logic follows
}
}
}
这适用于简单的属性和急切加载的 ToOnes。延迟加载的 ToOnes 会出现问题:
@ManyToOne(fetch=FetchType.LAZY, optional=true)
@LazyToOne(LazyToOneOption.NO_PROXY)
public UserGroup getGroup()
{
return group;
}
在我的测试用例中,
group
在请求期间(在临时事务中)被延迟加载。该属性在后续请求中更改。在稍后的“保存”请求中,更改的实体被合并到当前的 PersistenceContext 中。在 PostUpdate 事件侦听器中,oldValue 始终为org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer.UNFETCHED_PROPERTY
(在日志语句中为<lazy>
)。 newValue 是预期的变化值。
还有另一种方法可以找到更新后的延迟加载值吗?或者在另一个阶段?