У меня есть одинарное отношение «многие ко многим», которое мне нужно отобразить на 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 с такой настройкой, которая мне действительно нужна в будущем.