【问题标题】:EclipseLink/JPA EntityListener: Check if entity is modifiedEclipseLink/JPA EntityListener:检查实体是否被修改
【发布时间】:2026-02-05 08:25:01
【问题描述】:

我正在使用默认的 EntityListeners(preUpdate 和 prePersist)向我的实体写入创建和更新时间戳。当一个新的子元素被添加到一个集合(OneToMany)并且持久化被调用时,父记录被发送到 EntityListener 并且时间戳被更新。我的问题是,如果只将新的子记录添加到集合中,我不想更新父项。有没有办法检查实体是否被修改(在 EntityListerner 内)? 谢谢 安德烈亚斯

【问题讨论】:

    标签: eclipselink entitylisteners


    【解决方案1】:

    这可能会对您有所帮助(未经测试,但我认为它会起作用)。 event 是您得到的DescriptorEventobject 是您要检查更改的实体。

       UnitOfWorkImpl uow = (UnitOfWorkImpl) event.getSession();
       ClassDescriptor descriptor = uow.getDescriptor(object);
    
       boolean isNew = uow.isObjectNew(object);
            if (isNew || descriptor.getObjectChangePolicy().shouldCompareExistingObjectForChange(object, uow, descriptor)) {
                ObjectChangeSet changes = null;
                if (isNew) {
                    changes = descriptor.getObjectChangePolicy().calculateChangesForNewObject(object, changeSet, uow, descriptor, true);
                } else {
                    changes = descriptor.getObjectChangePolicy().calculateChangesForExistingObject(object, changeSet, uow, descriptor, true);
                }
       boolean hasChanges = changes.hasChanges();
    

    【讨论】: