Grails Hibernate GORM,具有一对一关系的多租户
Grails Hibernate GORM, Multi-Tenancy with one-to-one relationship
从教程中克隆了代码:Database per Tenant Multi-Tenancy
我进入完成的项目并开始摆弄东西。
我了解应用程序如何解析租户 ID 并轻松连接到不同的数据源。
让我摸不着头脑的是如何建立其他类型的关系。
本教程中显示的示例演示了多对多关系。我要使用的是单向一对一关系。
当然,我想这样做的方式是做一个简单的改变。我更改了 Vehicle.groovy 文件和 VehicleService.groovy
这是我的文件版本:
//Vehicle.groovy
package example
import grails.gorm.MultiTenant
class Vehicle implements MultiTenant<Vehicle> { // <1>
String model
Integer year
Engine engine
static constraints = {
model blank:false
year min:1980
}
}
//VehicleService.groovy
package example
// tag::class[]
import grails.gorm.multitenancy.CurrentTenant
import grails.gorm.services.Join
import grails.gorm.services.Service
import grails.gorm.transactions.Transactional
import groovy.transform.CompileStatic
@Service(Vehicle) // <1>
@CurrentTenant // <2>
@CompileStatic
abstract class VehicleService {
// end::class[]
// tag::queries[]
@Join('engine') // <1>
abstract List<Vehicle> list(Map args ) // <2>
abstract Integer count() // <3>
@Join('engine')
abstract Vehicle find(Serializable id) // <4>
// end::queries[]
// tag::save[]
abstract Vehicle save(String model,
Integer year)
// end::save[]
// tag::update[]
@Transactional
Vehicle update( Serializable id, // <5>
String model,
Integer year) {
Vehicle vehicle = find(id)
if (vehicle != null) {
vehicle.model = model
vehicle.year = year
vehicle.save(failOnError:true)
}
vehicle
}
// end::update[]
// tag::delete[]
abstract Vehicle delete(Serializable id)
// end::delete[]
}
这没有给出预期的结果。它会产生以下运行时错误:
如何修复此错误并建立正确的关系?我在这里缺少什么基本概念?我知道它的 SQL,但为什么加入专栏不起作用?
生成的查询不会是这样的:
SELECT * FROM Vehicles
JOIN Engines
WHERE Vehicles.ID = WHATEVER
ON Vehicles.engine_id= Engines.id
在 grails-app/views/vehicle/create.gsp 中替换第 30 行:
<f:all bean="vehicle"/>
和
${example.Vehicle.withNewSession { session ->
f.all([bean: 'vehicle'])
}}
错误应该会消失。
更好的解决方案:
替换第 30 行:
<f:all bean="vehicle"/>
和
<f:field bean="vehicle" property="model"/>
<f:field bean="vehicle" property="year"/>
您需要将引擎标记为可为空并为其构建另一个接口,或者将其添加到表单并向 VehicleController 中的保存操作添加一些绑定代码。
从教程中克隆了代码:Database per Tenant Multi-Tenancy
我进入完成的项目并开始摆弄东西。
我了解应用程序如何解析租户 ID 并轻松连接到不同的数据源。
让我摸不着头脑的是如何建立其他类型的关系。
本教程中显示的示例演示了多对多关系。我要使用的是单向一对一关系。
当然,我想这样做的方式是做一个简单的改变。我更改了 Vehicle.groovy 文件和 VehicleService.groovy
这是我的文件版本:
//Vehicle.groovy
package example
import grails.gorm.MultiTenant
class Vehicle implements MultiTenant<Vehicle> { // <1>
String model
Integer year
Engine engine
static constraints = {
model blank:false
year min:1980
}
}
//VehicleService.groovy
package example
// tag::class[]
import grails.gorm.multitenancy.CurrentTenant
import grails.gorm.services.Join
import grails.gorm.services.Service
import grails.gorm.transactions.Transactional
import groovy.transform.CompileStatic
@Service(Vehicle) // <1>
@CurrentTenant // <2>
@CompileStatic
abstract class VehicleService {
// end::class[]
// tag::queries[]
@Join('engine') // <1>
abstract List<Vehicle> list(Map args ) // <2>
abstract Integer count() // <3>
@Join('engine')
abstract Vehicle find(Serializable id) // <4>
// end::queries[]
// tag::save[]
abstract Vehicle save(String model,
Integer year)
// end::save[]
// tag::update[]
@Transactional
Vehicle update( Serializable id, // <5>
String model,
Integer year) {
Vehicle vehicle = find(id)
if (vehicle != null) {
vehicle.model = model
vehicle.year = year
vehicle.save(failOnError:true)
}
vehicle
}
// end::update[]
// tag::delete[]
abstract Vehicle delete(Serializable id)
// end::delete[]
}
这没有给出预期的结果。它会产生以下运行时错误:
如何修复此错误并建立正确的关系?我在这里缺少什么基本概念?我知道它的 SQL,但为什么加入专栏不起作用?
生成的查询不会是这样的:
SELECT * FROM Vehicles
JOIN Engines
WHERE Vehicles.ID = WHATEVER
ON Vehicles.engine_id= Engines.id
在 grails-app/views/vehicle/create.gsp 中替换第 30 行:
<f:all bean="vehicle"/>
和
${example.Vehicle.withNewSession { session ->
f.all([bean: 'vehicle'])
}}
错误应该会消失。
更好的解决方案:
替换第 30 行:
<f:all bean="vehicle"/>
和
<f:field bean="vehicle" property="model"/>
<f:field bean="vehicle" property="year"/>
您需要将引擎标记为可为空并为其构建另一个接口,或者将其添加到表单并向 VehicleController 中的保存操作添加一些绑定代码。