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

Hibernate 在Grails中使用多个数据源时使用错误的数据源进行验证?,hibernate,grails,Hibernate,Grails,我们使用的是Grails2.2.1,在尝试对绑定到多个数据源的域类执行CRUD操作时发现了一个问题 下面是静态映射的样子以及一些操作的结果: 在这种情况下,CAR表仅存在于d2中 现在,如果我将表添加到d1 因此,当您有多个数据源时,表必须存在于您列出的第一个数据源中,有人知道解决这个问题的方法吗 更新10/27 我已经尝试注入实际的数据源,并使用它来执行CRUD操作,作为一种解决方法。不幸的是,grails不允许您使用注入的数据源来指定更改的位置 链接: 这个问题似乎比最初预期的更糟。表不仅必

我们使用的是Grails2.2.1,在尝试对绑定到多个数据源的域类执行CRUD操作时发现了一个问题

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

现在,如果我将表添加到d1

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

更新10/27

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

链接:

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

更新2 10/27

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

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

carObject.d2.save(validate:false) 

这种解决方法的唯一问题显然是我失去了验证。

我尝试为会话工厂bean创建新会话。在此之后,执行do 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)
            }
        }

如果表不存在,为什么要在映射中列出这两个数据源?因此,实际上,我们有6个数据源可以存在表。在应用程序处于生产环境的整个生命周期内,该表可能不在所有6中。我们也不希望在生产中将表推送到其他环境时,必须将新的war文件推送到数据源中。我不明白为什么.listAll()可以正常工作,但CRUD操作有一个问题。您可以调用datasource carObject.d2.validate()上的validate吗?这听起来像是gorm中的一个bug。你可能想打开一张罚单。嗨,你现在有解决方案了吗?我的意思是让它与carObject.d2.save一起工作(validate:true)。不要丢失验证。
carObject.d2.save(validate:false) 
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)
            }
        }