Как сопоставить объединяемую таблицу со строковым внешним ключом

#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"]
   }