我正在使用遗留数据库,每当有东西被保存到其中一个表中的数据库时,我需要执行一些自定义逻辑。这包括检查几个字段以查看哪些类型的数据已更改,更新具有相应更改状态的字段,更新表中的其他行,然后最后插入新行或更新现有行。
显然,这比@SQLInsert或@SQLUpdate注释可以做的更多。实现这一目标的最佳方法是什么?我需要在对象即将被保存时调用的东西,进行一些手动SQL调用,然后取消内置的保存功能,因为我们手动处理它。
答案 0 :(得分:0)
您可以使用自定义事件侦听器。请参阅http://grails.github.io/grails-doc/2.5.x/guide/single.html#eventsAutoTimestamping(自定义事件监听器部分)。
一个例子是:
import org.grails.datastore.mapping.engine.event.PreUpdateEvent
import org.grails.datastore.mapping.engine.event.PreInsertEvent
import org.grails.datastore.mapping.engine.event.EventType
import org.springframework.context.ApplicationEvent
import org.grails.datastore.mapping.core.Datastore
class CustomSavePersistenceListener extends AbstractPersistenceEventListener {
public CustomSavePersistenceListener(final Datastore datastore) {
super(datastore)
}
@Override
public boolean supportsEventType(Class<? extends ApplicationEvent> eventType) {
eventType in [ PreUpdateEvent, PreInsertEvent ]
}
@Override
protected void onPersistenceEvent(final AbstractPersistenceEvent event) {
if (needsToBeCustomSaved(event.entityObject)) {
doCustomSave(event.eventType, event.entityObject)
event.cancel()
}
}
private boolean needsToBeCustomSaved(object) {
// Your conditions to decide if needs special persistence
}
private void doCustomSave(EventType eventType, object) {
// Your special persistence logic
}
}
准备好课程后,不要忘记注册。在Bootstrap的init闭包中,您可以添加:
application.mainContext.eventTriggeringInterceptor.datastores.each { k, datastore ->
applicationContext.addApplicationListener(new CustomSavePersistenceListener(datastore)
}
如果您定义了多个数据源,则可能需要在调用each
方法之前对其进行过滤。