Внедрение Grails двунаправленных отношений один-к-одному на уровне базы данных - PullRequest
1 голос
/ 17 января 2012

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

class AssessmentData {

    static hasOne = [assessmentField:AssessmentField, assessment:Assessment]

    AssessmentField field
}


class Assessment {
   AssessmentData assessmentData
}

Но я немного озадачен тем, как Grails реализует эти отношения на уровне базы данных.Как описано здесь , он просто устанавливает внешний ключ только в классе дочернего домена, в моем случае, в таблицы Assessment и AssessmentField.Это мой примитивный инстинкт, что обе таблицы должны иметь внешний ключ, ссылающийся друг на друга, чтобы установить двунаправленное отношение один к одному.Но так как это не так, я хочу знать, как это достигается Граальсом.

1 Ответ

2 голосов
/ 17 января 2012

Мой примитивный инстинкт, что обе таблицы должны иметь внешний ключ, ссылающийся друг на друга, чтобы установить двунаправленное отношение один к одному

Ваши инстинкты подвели вас. Домен, описанный в вашем вопросе, сгенерирует 2 таблицы базы данных:

assessment_data
----------------    
id


assessment
----------------
id
assessment_data_id

Используя SQL, мы можем получить assessment, связанный с assessment_data с идентификатором 4

select * from assessment where assessment_data_id = 4

Мы также можем пойти другим путем и получить assessment_data, связанный с assessment с идентификатором 5, используя

select ad.* from assessment_data ad
inner join assessment a ON a.assessment_data_id = ad.id
where a.id = 5

Так что, если мы можем «пойти по обоим направлениям» в SQL, то мы можем сделать это с помощью HQL, запросов критериев, динамических методов поиска и т. Д., Поскольку все они в конечном итоге переводятся в SQL.

...