Grails静态映射失败(重复id)

时间:2013-03-20 07:40:41

标签: grails mapping gorm

我正在尝试进行逆向工程,并为数据库中的给定表模式创建模型类。

表的名称为infopac_usersProva,它有两列:

  • strCip varchar(15),即id
  • USERNM varchar(75)

我写过这样的模型:

    class Infopac_usersProva {

       String strCip 
       String usernm

       static mapping={
        datasource 'gpaq'
        table 'infopac_usersProva'
        version false
        columns{
            id column: 'strCip'
            usernm column: 'USERNM', sqlType: "varchar(75)"
            strCip column: 'strCip', sqlType: "varchar(15)"
        }
       }

       static constraints = {
        strCip (nullable:true, insert:false, update:false)
       }
    }

但是我收到了这个错误:

  

实体映射中的重复列:edu.upc.gpaq.domain.generic.Infopac_usersProva列:strCip(应使用insert =“false”update =“false”映射)

我需要为strCip指定列名,因为如果我取出该行,模型就会尝试获取str_cip而不是strCip。如果我拿出“id column:'strCip',那么我会收到一条错误消息,说没有id列。

我做错了什么?

4 个答案:

答案 0 :(得分:1)

我认为你可以摆脱strCip的定义 而是正确定义id字段。

看看这是否适合你:

class Infopac_usersProva {

String usernm

static mapping={
    datasource 'gpaq'
    table 'infopac_usersProva'
    version false
    columns{
        id generator: 'assigned', name: 'strCip', type: 'string'
        usernm column: 'USERNM', sqlType: "varchar(75)"
    }
}

我没有检查过这个......

答案 1 :(得分:0)

这个应该有效:

class Infopack_usersProva {
    String strCip
    String usernm

    static constraints = {
        strCip(nullable: false, maxSize: 15)
        usernm(nullable: true, maxSize: 75)
    }

    static mapping = {
        datasource('gpaq')
        table('infopac_usersProva')
        version(false)
        autoTimestamp(false)
        usernm(column: 'USERNM')
        strCip(column: 'strCip')
        id(column: 'strCip', name: 'strCip', generator: 'assigned')
    }
}

但它有strCip不为空。但是AFAIK你需要一个非空的id列,所以我看不到任何解决方法。至少用grails / hibernate。

如果您希望strCip永远不会包含在任何save()中,您需要指定

strCip(column: 'strCip', insertable: false, updateable: false)

在映射块中。我不知道有任何名为insertupdate的约束,并希望它们在那里被忽略。

答案 2 :(得分:0)

我最终做了以下事情(见粗体文字)

class Infopac_usersProva {

  String usernm
  String id

  static mapping={
    datasource 'gpaq'
    table 'infopac_usersProva'
    version false
    autoTimestamp false
    columns{
        **id column: 'strCip', sqlType: "varchar(15)"**
        usernm column: 'USERNM', sqlType: "varchar(75)"
    }
  }

  static constraints = {

  }
}

现在有效。非常感谢你!

答案 3 :(得分:0)

可能会有点迟到,但您需要使用可更新和可插入的属性。它对我有用:

class Infopac_usersProva {

   String strCip 
   String usernm

   static mapping={
    datasource 'gpaq'
    table 'infopac_usersProva'
    version false
    columns{
        id column: 'strCip'
        usernm column: 'USERNM', sqlType: "varchar(75)"
        strCip column: 'strCip', updateable: false, insertable: false
    }
   }
}