Grails NPE在域的beforeInsert方法的第二个数据存储中创建表失败

Grails NPE在域的beforeInsert方法的第二个数据存储中创建表失败,grails,transactions,gorm,Grails,Transactions,Gorm,我使用运行时数据源插件创建第二个数据源,并在运行时创建动态表,方法是使用名为TableDefinition的域在主数据源中保留表信息,但在保存此域实例之前,我希望在第二个数据源上创建实际表,但由于NullPointerException而失败,虽然实际表是在第二个DB中创建的,但域实例不会持久化 第二数据源服务执行 class DataConnectionService { def runtimeDataSource static transactional = true de

我使用运行时数据源插件创建第二个数据源,并在运行时创建动态表,方法是使用名为TableDefinition的域在主数据源中保留表信息,但在保存此域实例之前,我希望在第二个数据源上创建实际表,但由于NullPointerException而失败,虽然实际表是在第二个DB中创建的,但域实例不会持久化

第二数据源服务执行

class DataConnectionService {

  def runtimeDataSource 
  static transactional = true

  def execute( String query, String dsName )
  {
    try
    {
        Sql sql =  runtimeDataSource.getSql( dsName )
        return sql.execute( query )
    }
    catch ( Exception e )
    {
        log.error( "Error in executing query $query [$e.message]", e )
        return null
    }
    finally
    {
        sql.close()
    }
  }
}
域的beforeinter方法

def beforeInsert()
{
    try {
        String q = "Create Table test ...."
        dataConnectionService.execute( q, dsName )
    }
    catch( e )
    {
        log.error "Creating table in 2nd db failed [$e.message]"
        return false
    }
}
异常堆栈类似于:

->>  163 | removeBatchLoadableEntityKey    in org.hibernate.engine.spi.BatchFetchQueue
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    388 | addEntity                       in org.hibernate.engine.internal.StatefulPersistenceContext
|    461 | addEntity . . . . . . . . . . . in     ''
|    143 | makeEntityManaged               in org.hibernate.action.internal.AbstractEntityInsertAction
|    203 | addResolvedEntityInsertAction . in org.hibernate.engine.spi.ActionQueue
|    181 | addInsertAction                 in     ''
|    216 | addAction . . . . . . . . . . . in     ''
|    324 | addInsertAction                 in org.hibernate.event.internal.AbstractSaveEventListener
|    288 | performSaveOrReplicate . . . .  in     ''
|    194 | performSave                     in     ''
|    125 | saveWithGeneratedId . . . . . . in     ''
|    209 | saveWithGeneratedOrRequestedId  in org.hibernate.event.internal.DefaultSaveOrUpdateEventListener
|    194 | entityIsTransient . . . . . . . in     ''
|    114 | performSaveOrUpdate             in     ''
|     90 | onSaveOrUpdate . . . . . . . .  in     ''
|    684 | fireSaveOrUpdate                in org.hibernate.internal.SessionImpl
|    676 | saveOrUpdate . . . . . . . . .  in     ''
|    671 | saveOrUpdate                    in     ''
|     58 | doInHibernate . . . . . . . . . in org.codehaus.groovy.grails.orm.hibernate.metaclass.SavePersistentMethod$1
|    188 | doExecute                       in org.codehaus.groovy.grails.orm.hibernate.GrailsHibernateTemplate
|    132 | execute . . . . . . . . . . . . in     ''
|     56 | performSave                     in org.codehaus.groovy.grails.orm.hibernate.metaclass.SavePersistentMethod
|    215 | doInvokeInternal . . . . . . .  in org.codehaus.groovy.grails.orm.hibernate.metaclass.AbstractSavePersistentMethod
|     69 | invoke                          in org.codehaus.groovy.grails.orm.hibernate.metaclass.AbstractDynamicPersistentMethod

在强制执行有关事务和查询的不同选项后,以下组合允许成功执行查询并保存域实例:

static transactional = false

sql.executeUpdate( query )
如果有人能提供一些关于这种行为的理由或任何更好的优化选择,那就太好了