在 Grails 中使用多个数据源时使用错误的数据源进行验证?

2024-03-15

我们正在使用 Grails 2.2.1,并且当我们尝试对绑定到多个数据源的域类执行 CRUD 操作时遇到问题。

这是我们的静态映射的样子以及一些操作的结果:
在这种情况下,CAR 表仅存在于 d2 中。

class Car {
   static mapping = {
      datasources(['d1','d2'])
   }
}

Car.d2.listAll() //This code works and return data from d2
carObject.d2.save() //This code fails with a Table or View does not exist

现在如果我将表添加到 d1

class Car {
   static mapping = { 
      datasources(['d1','d2'])
   }
}

Car.d2.listAll() //This code works and return data from d2
carObject.d2.save() //This code now works and inserts a row into table in d2

因此,当您有多个数据源时,该表似乎必须存在于您列出的第一个数据源中,有人知道解决这个问题的方法吗?

更新 10/27

我尝试注入实际数据源并使用它来执行 CRUD 操作作为解决方法。不幸的是,grails 不允许您使用注入的数据源来指定您希望更改的位置。

Link: 如何在Grails中使用注入的dataSource来执行操作? https://stackoverflow.com/questions/26564026/how-to-use-injected-datasource-in-grails-to-perform-operations

问题似乎比最初预期的更严重。该表不仅必须存在于列出的第一个数据源中,而且似乎也在检查数据。它不允许我使用 d1 中存在的键将记录插入 d2 中。

更新 2 10/27

经过研究,验证似乎是针对列出的第一个数据源运行的,然后是在指定的数据源上执行实际操作。

如果我传入 validate false 它现在可以工作:

carObject.d2.save(validate:false) 

显然,这个解决方案的唯一问题是我失去了验证。


我尝试为会话工厂 bean 创建新会话。然后执行object.save()。看起来有效。参见示例:

def ctx = grailsApplication.mainContext

        ctx.getBeanNamesForType(SessionFactoryImplementor.class).each {

            SessionFactoryImplementor sfi = ctx.getBean(it)
            GrailsSessionContext gsc = new GrailsSessionContext(sfi)

            if(!TransactionSynchronizationManager.getResource(gsc.sessionFactory)) {
                def newSession = gsc.sessionFactory.openSession()
                def sessionHolder = new SessionHolder(newSession)
                TransactionSynchronizationManager.bindResource(gsc.sessionFactory, sessionHolder)
            }
        }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Grails 中使用多个数据源时使用错误的数据源进行验证? 的相关文章

随机推荐