我正在编写Grails 2.3.7应用程序,其中有两个域实体:Comment
和Event
。保存在数据库中的每个新的Comment
都应该生成并持久化相应的Event
。为此,我尝试在AbstractPersistenceEventListener
:中拦截PostInsertEvent
class MyPersistenceEventListener extends AbstractPersistenceEventListener {
public MyPersistenceEventListener(Datastore ds) {
super(ds)
}
@Override
protected void onPersistenceEvent(AbstractPersistenceEvent event) {
Event.withTransaction {
new Event(text: "New comment posted").save()
}
}
@Override
boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
return eventType.isAssignableFrom(PostInsertEvent)
}
}
这种方法不起作用:调用了onPersistenceEvent
,但新的事件记录不会出现在数据库中。是否可以在perstence事件侦听器中保存另一个实体,或者是否有更好的方法来做到这一点?
最后,我设法将它保存在不同的线程中:
class MyPersistenceEventListener extends AbstractPersistenceEventListener {
final def eventQueue = new DataflowQueue()
public MyPersistenceEventListener(Datastore ds) {
super(ds)
Dataflow.operator(inputs: [eventQueue], maxForks: 10) { event ->
Event.withTransaction {
event.save()
}
}
}
@Override
protected void onPersistenceEvent(AbstractPersistenceEvent event) {
if (event.entityObject instanceof Comment) {
eventQueue << new Event(text: "New comment posted")
}
}
@Override
boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
return eventType.isAssignableFrom(PostInsertEvent)
}
}
但我仍然怀疑这是否是正确的解决方案。。。