#grails #grails-orm
#grails #grails-orm
Вопрос:
Возникли проблемы с настройкой объединяемой таблицы в Grails 3.
У меня есть два класса домена (A и B) с отношением «многие ко многим» друг к другу. В Grails 3 я определил домены с сопоставлением объединяемых таблиц. В базе данных (MySQL v5) У меня есть три таблицы: A, B и таблица соединений A_B. Таблица B использует «varchar» в качестве sqlType первичного ключа. Таблица A использует «int» в качестве sqlType первичного ключа.
Я добавил A и B в свою базу данных вместе с записью в таблице объединения, чтобы связать их вместе.
В моем тестовом коде, когда я пытаюсь загрузить экземпляр A, A.get(id), я получаю сообщение об ошибке, указывающее, что тип внешнего ключа в объединяемой таблице неизвестен.
Domain A:
static hasMany = [bs: B]
static mapping = {
table "A"
id column: 'id', sqlType: 'int'
bs joinTable: [name: "A_B", key: "a_id"]
}
Domain B:
static hasMany = [as: A]
static mapping = {
table "B"
id column: 'id', sqlType: 'varchar'
as joinTable: [name: "A_B", key: "b_id"]
}
Итак, похоже, что «varchar» в B или ForeignKey в B в таблице объединения интерпретируется как Long .
Я смог обойти проблему, добавив третий домен для объединяемой таблицы, определив столбцы.
Domain AB
Long aId
String bId
static mapping = {
table "A_B"
id composite: ['aId', 'bId']
aId column: 'a_id', sqlType: 'int'
bId column: "b_id", sqlType: 'varchar'
}
Похоже, я должен быть в состоянии настроить объединяемую таблицу в Grails 3 без необходимости определять объединяемую таблицу как домен. Кто-нибудь знает, как это сделать?
Ответ №1:
Хорошо, я решил проблему. Это была оплошность с моей стороны.
Все, что потребовалось, это определить тип ‘id’ в домене B, например,
Domain B:
String id // <= Declare the id.
static hasMany = [as: A]
static mapping = {
table "B"
id column: 'id', sqlType: 'varchar'
as joinTable: [name: "A_B", key: "b_id"]
}