Grails 域是不是可能没有“id”?

Posted

技术标签:

【中文标题】Grails 域是不是可能没有“id”?【英文标题】: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 语句。

【问题讨论】:

【参考方案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'
    


【讨论】:

以上是关于Grails 域是不是可能没有“id”?的主要内容,如果未能解决你的问题,请参考以下文章

跨两个数据源的 Grails GORM 域关联

在 grails 中获取分离的域实体

从域对象调用 Grails 服务是否很糟糕? [关闭]

grails 使用 uuid 作为 id 并映射到二进制列

Grails:如何从控制器逻辑返回错误消息(即不是源自域属性验证)?

使用 grails 建模复杂的域模型 [关闭]