Grails 如何使用字符串外键映射joinTable

Grails 如何使用字符串外键映射joinTable,grails,gorm,Grails,Gorm,在Grails3中设置连接表时遇到问题 我有两个域类(A和B),它们之间有多对多的关系。在Grails3中,我使用可连接映射定义了域。在数据库(MySql v5)中,我有三个表,A、B和联接表A_B。B表使用“varchar”作为主键sqlType。表A使用“int”作为主键sqlType 我在数据库中添加了一个A和B,并在联接表中添加了一个条目,以将两者链接在一起 在我的测试代码中,当我尝试加载A.get(id)的实例时,我得到一个错误,指示JoinTable中ForeignKey的类型未知

在Grails3中设置连接表时遇到问题

我有两个域类(A和B),它们之间有多对多的关系。在Grails3中,我使用可连接映射定义了域。在数据库(MySql v5)中,我有三个表,A、B和联接表A_B。B表使用“varchar”作为主键sqlType。表A使用“int”作为主键sqlType

我在数据库中添加了一个A和B,并在联接表中添加了一个条目,以将两者链接在一起

在我的测试代码中,当我尝试加载A.get(id)的实例时,我得到一个错误,指示JoinTable中ForeignKey的类型未知

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

因此,B中的“varchar”或联接表中B的foreignKey似乎被解释为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'
   }


似乎我应该能够在Grails3中设置JoinTable,而不必将JoinTable定义为域。有人知道怎么做吗?

好的,我解决了这个问题。这是我的疏忽

只需在域B中定义“id”类型,例如

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"]
   }
域B:
字符串id//