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”?的主要内容,如果未能解决你的问题,请参考以下文章