在 NPE 失败的域的 beforeInsert 方法中的第二个 DataStore 中创建 Table
Create Table in 2nd DataStore in beforeInsert Method of Domain Failed by NPE
我使用 运行-time 数据源插件来获得第二个数据源,并在 运行-time 中创建动态 table,方法是使用名为 TableDefinition 的域来保存 table 信息在主数据源中,但在保存此域实例之前,我想在第二个数据源上创建实际的 table,但它因 NullPointerException 而失败,而实际的 table 是在第二个数据库中创建的,但域实例未保留。
第二次数据源服务执行
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()
}
}
}
域的beforeInsert方法
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
| 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 )
如果有人能提供一些关于此行为的原因或任何更好的优化替代方案,那就太好了。
我使用 运行-time 数据源插件来获得第二个数据源,并在 运行-time 中创建动态 table,方法是使用名为 TableDefinition 的域来保存 table 信息在主数据源中,但在保存此域实例之前,我想在第二个数据源上创建实际的 table,但它因 NullPointerException 而失败,而实际的 table 是在第二个数据库中创建的,但域实例未保留。
第二次数据源服务执行
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()
}
}
}
域的beforeInsert方法
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
| 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 )
如果有人能提供一些关于此行为的原因或任何更好的优化替代方案,那就太好了。