【问题标题】:How to map a joinTable with a String foreign key如何使用字符串外键映射 joinTable
【发布时间】:2019-03-27 18:16:46
【问题描述】:

在 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 的外键似乎被解释为 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 grails-orm


    【解决方案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"]
       }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-19
      • 2020-01-15
      • 2020-02-03
      • 2011-05-27
      相关资源
      最近更新 更多