【问题标题】:JPA 2.1 Create entity within JPA EntityListenerJPA 2.1 在 JPA EntityListener 中创建实体
【发布时间】:2013-08-30 03:46:03
【问题描述】:

一旦我的一个实体被更改或创建,我就会尝试创建一个日志条目。为了做到这一点,我在 AbstractEntity 类上注册了一个 EntityListener。 AbstractEntity 有一个 LogEntries 列表,并且该列表的级联类型是 ALL(我的所有实体都继承自 AbstractEntity)。

我的 EntityListener 的当前实现:

public class EntityChangeListener {

    @Inject
    SessionController sessionController;

    @PreUpdate
    public void preUpdate(AbstractEntity entity) {
        createLogEntryFor(entity, LogEntry.ChangeType.UPDATED);
    }

    @PrePersist
    public void prePersist(AbstractEntity entity) {
        createLogEntryFor(entity, LogEntry.ChangeType.CREATED);
    }

    private void createLogEntryFor(AbstractEntity entity, LogEntry.ChangeType changeType) {
        if (!(entity instanceof LogEntry)) {
            Date now = Calendar.getInstance().getTime();
            LogEntry logEntry = new LogEntry();
            logEntry.setCreator(sessionController.getCurrentUser());
            logEntry.setAbstractEntity(entity);
            logEntry.setChangeDate(now);
            logEntry.setChangeType(changeType);
            entity.getLogEntries().add(logEntry);
        }
    }
}

问题是日志条目没有持久化,尽管使用了级联类型 all。我还尝试删除级联类型并注入我的 LogEntryService(带有 CRUD 方法的 SLSB)以手动持久化 LogEntry,但它也没有效果。

使用@PostPersist 和@PostUpdate 也会出现同样的问题。

JPA 提供者是 EclipseLink (2.5.0)。

切换到 Hibernate 并使用 Envers 是不行的。

【问题讨论】:

    标签: java jpa eclipselink entitylisteners jpa-2.1


    【解决方案1】:

    prePersist 事件应该可以工作,因为 prePersist 在计算更改之前被调用。

    对于 preUpdate,这将不起作用,因为更改是在调用 preUpdate 事件之前计算的,因此再更改任何内容都为时已晚。

    您可以改用 EclipseLink DescriptorEvents,因为它可以让您访问更高级的选项。您可以获取 Session 并在其上直接调用 insertObject() 以强制插入日志条目,或更改对象或 UnitOfWork ChangeSet。

    还要考虑 EclipseLink 的历史支持, http://wiki.eclipse.org/EclipseLink/Examples/JPA/History

    EclipseLink 应该提供一个选项来执行两次提交,以允许事件更改对象,请为此记录一个错误并为它投票(或找到并为现有的投票)。

    【讨论】:

    • 好的,但是一旦我使用 DescriptorEvents,我就必须检查实体是否已更改,并且我失去了 JPA 2.1 在 Entitylisteners 中注入 CDI Bean 的新功能。对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 1970-01-01
    • 2018-04-13
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    相关资源
    最近更新 更多