我们正在使用 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)
显然,这个解决方案的唯一问题是我失去了验证。