我嘗試在一個實體被更改或創建後立即創建一個日誌條目。爲了做到這一點,我在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