Grails Domain是否可能没有'id'?

时间:2010-04-06 05:49:33

标签: mysql hibernate grails gorm

是否可以创建一个没有'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语句。

5 个答案:

答案 0 :(得分:6)

Gorm需要id字段才能工作。您可以使用如下的瞬态变量伪造指定的ID。 getter和setter将nid字段映射到id字段。

使用此方法保存域对象时,您必须执行以下操作:

snbrActVectgor.save(insert:true)

因为grails认为非null 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'
    }
}

答案 1 :(得分:4)

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

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

答案 2 :(得分:2)

没有办法没有" id"。你可以做的是改变" id"的名称。字段使用分配的id生成器。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

在Oracle中,您可以使用ROWID作为ID列。

class Document {
    String id

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

}