Как настроить унарное отношение «многие ко многим» в Grails - PullRequest
0 голосов
/ 25 апреля 2019

У меня есть одинарное отношение «многие ко многим», которое мне нужно отобразить на Grails:

  • Для ACCESS_RIGHT может потребоваться, чтобы несколько других ACCESS_RIGHT были предоставлены первыми перед собой.
  • В результате ACCESS_RIGHT может иметь несколько требований и нескольких иждивенцев.
  • Программа должна быть в состоянии определить, когда ACCESS_RIGHT стал требованием для другого ACCESS_RIGHT.

Я использовал для этого таблицу соединения в своем приложении Grails.

AccessRight {
    String id
    String name
    String description

    static hasMany = [
        requirements: Dependency,
        dependents: Dependency
    ]
}

Dependency {
    String id
    Date effectivityDate

    static belongsTo = [
        dependent: AccessRight,
        requirement: AccessRight
    ]
}

Проблема в том, что столбец, автоматически отображаемый Hibernate, неверен.Рассмотрим пример:

AccessRight rights = AccessRight.findById(id)

// select
//     this_.id as id1_4_3_,
//     this_.name as name2_4_3_,
//     this_.description as descript3_4_3_
// from
//     access_right this_
// where
//     this_.id = ?

LinkedHashSet<Dependecy> listOfDependents = rights.getDependents()

// select
//     dependenci0_.dependent_id as access_r2_4_0_,
//     dependenci0_.id as id1_5_0_,
//     dependenci0_.id as id1_5_1_,
//     dependenci0_.dependent_id as dependen2_5_1_,
//     dependenci0_.effectivity_date as effectiv2_5_2_,
//     dependenci0_.requirement_id as require3_5_1_
// from
//     dependency dependenci0_
// where
//     dependenci0_.dependent_id = ?

LinkedHashSet<Dependecy> listOfRequirements = rights.getRequirements()

// select
//     dependenci0_.dependent_id as access_r2_4_0_,
//     dependenci0_.id as id1_5_0_,
//     dependenci0_.id as id1_5_1_,
//     dependenci0_.dependent_id as dependen2_5_1_,
//     dependenci0_.effectivity_date as effectiv2_5_2_,
//     dependenci0_.requirement_id as require3_5_1_
// from
//     dependency dependenci0_
// where
//     dependenci0_.dependent_id = ?

Обратите внимание, что при вызове .getDependents() он запрашивает таблицу Dependency, используя столбец dependent_id.Но когда вызывается .getRequirements(), вместо подключения с помощью requirement_id, он также использует тот же dependent_id.Что дает?Есть ли способ вручную объявить, какой столбец использовать в свойстве hasMany?

В настоящее время я использую следующие методы для извлечения записей.

List<Dependency> getDependents() {
    return Dependency.createCriteria().list {
        eq("requirement", this)
    }
}

List<Dependency> getRequirements() {
    return Dependency.createCriteria().list {
        eq("dependent", this)
    }
}

Проблема заключается в том, что яне могу использовать FetchMode.EAGER с такой настройкой, которая мне действительно нужна в будущем.

...