hibernate - Grails Hibernate GORM,具有一对一关系的 Multi-Tenancy

标签 hibernate grails grails-orm multi-tenant

从教程中克隆代码: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[]
}

这不会给出预期的结果。它会创建以下运行时错误:
enter image description here

如何修复此错误并建立正确的关系?我在这里缺少什么基本概念?我知道它的 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"/>

您需要将引擎标记为可为空并为其构建另一个接口(interface),或者将其添加到表单中并将一些绑定(bind)代码添加到 VehicleController 中的保存操作中。

关于hibernate - Grails Hibernate GORM,具有一对一关系的 Multi-Tenancy ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50804458/

相关文章:

java - EntityManager 生命周期和持续的客户端-服务器-通信

grails - 与Grails 2.2.1插件依赖项解析不一致

java - 在事务上下文中使用 findBy

grails - GORM : Change from composite key to auto incrementing primary key

validation - 获取失败约束的名称

java - 如何在 Hibernate 中使用 order 子句

java - Liferay 7 hibernate方言不兼容问题

java - Spring Boot JPA CrudRepository - 实体不附加到 persistencecontext

grails - 更改 Controller 后Grails 2.3.1返回404

api - 适用于Dropbox的Groovy Rest API,无需第三方插件/库