Как сопоставить joinTable с внешним ключом String - PullRequest
1 голос
/ 27 марта 2019

Проблемы с настройкой JoinTable в Grails 3.

У меня есть два класса предметной области (A и B) с отношением «многие ко многим». В Grails 3 я определил домены с отображением JoinTable. В базе данных (MySql v5) у меня есть три таблицы A, B и таблица соединений A_B. Таблица B использует «varchar» в качестве первичного ключа sqlType. Таблица A использует "int" в качестве первичного ключа sqlType.

Я добавил A и B в свою базу данных вместе с записью в таблице соединений, чтобы связать их вместе.

В моем тестовом коде, когда я пытаюсь загрузить экземпляр A, A.get (id), я получаю сообщение об ошибке, указывающее, что тип ForeignKey в JoinTable неизвестен.

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 или иностранный ключ B в таблице соединения интерпретируется как Long.

Мне удалось обойти эту проблему, добавив третий домен для JoinTable, определив столбцы.

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'
   }

Похоже, я должен иметь возможность настроить JoinTable в Grails 3 без необходимости определять JoinTable как домен. Кто-нибудь знает, как это сделать?

1 Ответ

1 голос
/ 28 марта 2019

ОК, я решил проблему.Это был недосмотр с моей стороны.

Все, что нужно, это определить тип '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"]
   }
...