Наследство в grails

Я разрабатываю приложение в grails и нуждаюсь в том, чтобы представить наследство между двумя организациями. Проблема коренится, в котором, когда я устанавливаю связь:

class Documento {
static mapping = {
        tablePerHierarchy false
    }

class Tesis extends Documento{
}

Когда я произвожу вид диссертации, он просит меня, чтобы наполнять поля, чтобы принадлежали таблице Документы, и в базе данных мне не удается увидеть связь между обоими подмостками или я не понимаю, как устанавливается вышеупомянутая связь.

0
задан 31.03.2016, 01:53
3 ответа

Назначенный по умолчанию Grails использует представление наследства, которое называются TPH (table-per-hierarchy).

TPH использует "дискриминатор", чтобы определять какого класса это каждый tupla (колонна class). Поскольку они смогут наблюдать, он не производит несколько подмостков для каждого класса, но все признаки находятся в той же таблице (таблица отец в этом случае Persona). По этой причине, он обоснован, что некие поля остались пустыми, завися, какой класс введен.

Плохое этого представления состоит в том, что он не позволяет иметь стоимость not null. А именно, если мы имели, класс Profesor как следующая:

class Profesor extends Persona {
    String materiaDictada
    // otras props...

    static constraints = {
    }
}

и materiaDictada он not null, классы типа явись лично или от типа ученик они не могли бы быть предохраненными (так как он дал бы ошибку INSERT). В этом случае могут использовать подход TPS (table_per_subclass), что возможно делать посредством ORM DSL.

Способ дезактивировать назначенное по умолчанию поведение grails, был бы тем, о чем упоминают в начальном вопросе:

class Persona {
    ...
    static mapping = {
        tablePerHierarchy false
    }
}

Я надеюсь, что он служит.

Привет

3
ответ дан 24.11.2019, 14:40

Я помогаю прояснять проблему друга Пола... Тема - следующая с другим немного более практическим примером.

Domain:

package com.test

class Persona {
    String nombre
    String apellido
    Date fechaNacimiento

    static constraints = {
    }
}

class Alumno extends Persona{

    int legajo
    int curso
    int promedio

    static constraints = {
    }
}

В базе данных могут наблюдать следующее, когда вводят 2 новых Ученика и 1 новый человек: (Следующий код - SELECT * from ЧЕЛОВЕК)

# id, version, apellido, fecha_nacimiento, nombre, class, curso, legajo, promedio
1, 0, Argento, 2016-04-02 00:00:00, Pepe, com.test.Alumno, 3, 33333, 9
2, 0, Argento, 2016-04-02 00:00:00, Moni, com.test.Alumno, 1, 55555, 1
3, 0, Persona 1, 2016-04-02 00:00:00, Nombre Persona 1, com.test.Persona, null, null, null

не существует таблица "УЧЕНИК" внутри BD

1
ответ дан 24.11.2019, 14:40
  • 1
    благодаря всем из-за Вашей помощи – Yusniel Hidalgo 08.05.2016, 02:14

Из-за собственного опыта в нескольких проектах я увидел, что это не очень хорошая идея использовать наследство, особенно, если ты работаешь в Grails, эффекты уже ты смог подтверждать их, а именно, база данных не кажется очень консистентной, это проистекает того, что в относительной модели не существует способ сажать лицом к ситуации наследства, следовательно ты можешь начинать видеть подмостки со странной информацией / структурой и включая дублированная информация, что не очень хорошая идея. Также в момент разрабатывания доказательств сторонницы государственного единства / интеграция - истинная головная боль пробовать писать код доказательств, если код основал уже, содержит случаи наследства. Я лично разработал несколько моделей в grails однако вместо того, чтобы использовать связи наследства использовал связи состава, это казалось мне гениальным, пожалуйста дает ревизию следующей статье.

https://devexperto.com / herencia-vs-composicion /

Твоя модель могла бы быть преобразованной для того, чтобы он использовал связь состава следующего способа:

class Documento {
    static constraints {}
}

class Tesis {
    Documento documento
}

Вышеупомянутая модель классов может быть легко представленной как 2 подмостков внутри базы данных.

1
ответ дан 24.11.2019, 14:40