在休眠的实体侦听器中更新之前获取原始对象

时间:2019-10-18 09:38:14

标签: java spring hibernate spring-boot entitylisteners

我正在尝试实现一个实体侦听器,该侦听器将@PreUpdate事件中的原始对象与更新后的对象进行比较。我试图使用Jpa存储库通过ID从数据库查询原始对象,以将其与事件中接收到的对象进行比较。但是它会检索相同的对象(我猜它会返回会话作用域中存在的对象)。

是否可以通过实体侦听器从数据库中获取原始对象?

1 个答案:

答案 0 :(得分:0)

JPA不在EntityListener中提供旧状态和新状态。

但是您可以使用休眠拦截器:

public static class LoggingInterceptor extends EmptyInterceptor {
    @Override
    public boolean onFlushDirty(
        Object entity,
        Serializable id,
        Object[] currentState,
        Object[] previousState,
        String[] propertyNames,
        Type[] types) {
            LOGGER.debugv( "Entity {0}#{1} changed from {2} to {3}",
                entity.getClass().getSimpleName(),
                id,
                Arrays.toString( previousState ),
                Arrays.toString( currentState )
            );
            return super.onFlushDirty( entity, id, currentState,
                previousState, propertyNames, types
        );
    }
}

在此示例中,您看到当前和先前状态是可以轻松比较的数组。

请阅读文档:https://docs.jboss.org/hibernate/orm/5.4/userguide/html_single/Hibernate_User_Guide.html#events