【问题标题】:Is it possible for a Grails Domain to have no 'id'?Grails 域是否可能没有“id”?
【发布时间】:2011-02-04 16:33:38
【问题描述】:

是否可以创建一个没有“id”的表?例如,这是我的域:

class SnbrActVector {

    int nid
    String term
    double weight

    static mapping = {
        version false
        id generator: 'identity'
    }

    static constraints = {
    }
}

当我运行这条 SQL 语句时,它失败了:

insert into snbr_act_vector values (5, 'term', 0.5)

我检查了表格,'id' 已经设置为自动增量。我在想另一种选择是删除“id”本身。还是有另一种解决方法?请假设不能更改给定的 SQL 语句。

【问题讨论】:

    标签: mysql hibernate grails grails-orm


    【解决方案1】:

    Gorm 需要一个 id 字段才能工作。您可以使用如下所示的瞬态变量来伪造分配的 id。 getter 和 setter 将 nid 字段映射到 id 字段。

    使用此方法保存域对象时,您必须这样做:

    snbrActVectgor.save(insert:true)
    

    因为 grails 认为非空 id 是一个持久实例。

    class SnbrActVector {
        Integer id
        // nid is the actual primary key
        static transients = ['nid']
        void setNid(Integer nid) {
            id = nid
        }
        Integer getNid() {
            return nid
        }
    
        static mapping = {
            version false
            id generator:'assigned', column:'nid', type:'integer'
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可能需要指定 nid 是您的 id 列。

      static mapping = {
          version false
          id generator: 'identity', column: 'nid'
      }
      

      【讨论】:

      • 看起来这可能是另一种方法。我可能需要使用“生成器”属性。请再次注意,主要目标是使该语句无需任何修改即可工作:插入 snbr_act_vector 值 (5, 'term', 0.5)
      • 如果这确实是您的目标,您可能需要在数据库中进行一些额外的设置。也许是将语句转换为表定义的触发器?否则,我认为 Luke 的答案与您在 Grails / GORM 中所能做的最接近。
      【解决方案3】:

      没有“id”是不可能的。您可以做的是使用分配的 id 生成器更改“id”字段的名称。

      【讨论】:

        【解决方案4】:

        尝试使用:“id(generator:'assigned')”而不是“id generator:'identity'”,看看是否会从“id”数据库列中删除自动增量属性。

        【讨论】:

        • 感谢您的回复。现在刚刚测试了您的建议,不幸的是,“id”仍然存在。
        • 顺便说一句,它确实删除了“id”的自动增量属性。但我需要的是完全删除“id”列并且只有 3 列:nid、term、weight
        【解决方案5】:

        是的,在 Oracle 中,您可以将 ROWID 用于 ID 列。

        class Document {
            String id
        
            static mapping = {
                table "DOCUMENTS"
                version false
                id column: 'ROWID'
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-02-26
          • 2022-01-08
          • 1970-01-01
          • 2021-12-27
          • 2014-07-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多