Hibernate 在 PostUpdate 事件期间无法在快照中找到延迟加载(NOPROXY)属性

问题描述 投票:0回答:0

我在 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 是预期的变化值。

还有另一种方法可以找到更新后的延迟加载值吗?或者在另一个阶段?

hibernate lazy-loading
© www.soinside.com 2019 - 2024. All rights reserved.