Grails Hibernate GORM, многопользовательские отношения с личными отношениями - PullRequest
0 голосов
/ 11 июня 2018

Клонировал код из учебника: База данных на каждого арендатора Multi-Tenancy

Я пошел в законченный проект и начал играть с вещами.

Я понимаю, какприложение разрешает идентификаторы арендаторов и без труда подключается к различным источникам данных.

Что заставляет меня чесать голову, так это создавать другие типы отношений.

Пример, показанный в руководстве, демонстрируетотношения многие ко многим.То, что я хочу использовать, - это однонаправленные отношения один-к-одному.

Естественно, я думал сделать это, чтобы сделать простое изменение.Я изменил файл 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

1 Ответ

0 голосов
/ 22 июня 2018

В 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.

...