我尝试在一个实体被更改或创建后立即创建一个日志条目。为了做到这一点,我在AbstractEntity类上注册了一个EntityListener。 AbstractEntity有一个LogEntries列表,这个列表的级联类型是ALL(我的所有实体都继承自AbstractEntity)。JPA 2.1在JPA EntityListener中创建实体
当前实现我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);
}
}
}
的问题是,日志条目不会保留,虽然使用级联输入所有。我也尝试删除级联类型并注入我的LogEntryService(带有CRUD方法的SLSB)以便手动持久化LogEntry,但它也没有效果。
通过使用@PostPersist和@PostUpdate发生同样的问题。
JPA提供者是EclipseLink(2.5.0)。
切换到休眠状态并使用Envers是没有选择的。
好的,但只要我使用DescriptorEvents,我必须执行检查实体是否发生了变化,并且我失去了JPA 2.1在Entitylisteners中注入CDI Beans的强大新功能。对? – mare