gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 23:01:28 27 4
gpt4 key购买 nike

我们正在使用 Grails 2.2.1,并且当我们尝试对绑定(bind)到多个数据源的域类执行 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

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

链接:How to use injected dataSource in Grails to perform operations?

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

更新 2 10/27

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

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

carObject.d2.save(validate:false) 

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

最佳答案

我尝试为 session 工厂 bean 创建新 session 。然后执行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)
}
}

关于hibernate - 在 Grails 中使用多个数据源时使用错误的数据源进行验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26549004/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com