Hibernate:在插入或更新

时间:2015-07-31 23:56:45

标签: java hibernate groovy sql-update sql-insert

我正在使用遗留数据库,每当有东西被保存到其中一个表中的数据库时,我需要执行一些自定义逻辑。这包括检查几个字段以查看哪些类型的数据已更改,更新具有相应更改状态的字段,更新表中的其他行,然后最后插入新行或更新现有行。

显然,这比@SQLInsert或@SQLUpdate注释可以做的更多。实现这一目标的最佳方法是什么?我需要在对象即将被保存时调用的东西,进行一些手动SQL调用,然后取消内置的保存功能,因为我们手动处理它。

1 个答案:

答案 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方法之前对其进行过滤。