如何使用String外键映射joinTable

问题描述 投票:1回答:1

在Grails 3中设置JoinTable时遇到问题。

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

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

在我的测试代码中,当我尝试加载A,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'
   }

看起来我应该能够在Grails 3中设置JoinTable而无需将JoinTable定义为域。有谁知道如何做到这一点?

grails gorm
1个回答
1
投票

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

所需要的只是在域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"]
   }
© www.soinside.com 2019 - 2024. All rights reserved.