有人能告诉我清楚,完整,100%的工作方式将字符串类型的字段设置为grails中的ID吗?我已阅读文档,然后在网上阅读所有类似的咆哮,但未能创建工作原型。
这是我试图让你相信我不只是懒得等待某人去做这件事的尝试之一)))
class User {
String login
static hasMany = [apps : Application]
static constraints = {
}
static mapping = {
id generator: 'assigned', name: "login"
}
}
答案 0 :(得分:8)
当您使用自然ID时,您必须使用findBy方法而不是此测试中演示的get方法:
def user = new User(login: "test")
assertNotNull user.save(flush: true)
user = User.findByLogin("test")
assertNotNull user
assertEquals "test", user.login
或者,您可以使用单个字段composite id映射:
class User implements Serializable {
String login
static hasMany = [apps: Application]
static constraints = {
}
static mapping = {
id composite: ['login']
}
}
请注意,实现Serializable 需要composite id个域类。
composite id的测试将是:
def user = new User(login: "test")
assertNotNull user.save(flush: true)
user = User.get(new User(login: "test"))
assertNotNull user
assertEquals "test", user.login
答案 1 :(得分:3)
我假设您正在讨论将String主键(通常是自然键)映射到Grails域对象中的主键。
此答案来自此处的信息: http://dsommerville.blogspot.com/2009/09/mapping-natural-keys-using-gorm.html 和这里: http://gr8fanboy.wordpress.com/2010/04/08/adding-a-natural-key-to-a-database-table-using-straight-gorm/
例如,您有一个使用以下架构定义的用户表:
username varchar(40) not null pimary key,
firstname varchar(40) not null,
lastname varchar(40) not null
要在grails中执行此操作,您必须按一下这个定义。 首先,您必须将id映射到数据库中的给定列。使用发电机“分配”
然后,为了便于使用,您可能需要添加瞬态字段用户名,以便可以使用user.username =。否则,我相信你必须使用id访问该字段。 此瞬态属性的getter和setter设置了相应的“id”字段,该字段又会更新数据库。
class User {
String id
String password
String fullName
static transients = ['username']
static constraints = {
id(unique:true,blank:false)
password(nullable:true,maxSize:20)
fullName(nullable:true,maxSize:20)
}
static mapping = {
table 'users'
id column: 'username', generator: 'assigned'
version false
}
//
void setUsername(String username) {
id = username
}
String getUsername() {
return id
}
}
注意:脚手架无法识别瞬态字段,因此如果您希望代码更接近您的数据库建模,则必须使用生成的控制器/视图。