grails中的字符串ID-具体如何实现?

grails中的字符串ID-具体如何实现?,grails,groovy,gorm,Grails,Groovy,Gorm,有人能告诉我在grails中将字符串类型字段设置为ID的清晰、完整、100%的工作方式吗?我读过这些文档,然后在网上读过所有类似的咆哮,但未能创建一个工作原型 下面是我的一次尝试,让你相信我不是在懒洋洋地等待别人来做这项工作 }当您使用自然id时,您必须使用该方法,而不是本测试中演示的方法: def user = new User(login: "test") assertNotNull user.save(flush: true) user = User.findByLogin("test"

有人能告诉我在grails中将字符串类型字段设置为ID的清晰、完整、100%的工作方式吗?我读过这些文档,然后在网上读过所有类似的咆哮,但未能创建一个工作原型

下面是我的一次尝试,让你相信我不是在懒洋洋地等待别人来做这项工作


}

当您使用自然id时,您必须使用该方法,而不是本测试中演示的方法:

def user = new User(login: "test")
assertNotNull user.save(flush: true)

user = User.findByLogin("test")
assertNotNull user
assertEquals "test", user.login
或者,您可以使用单个字段映射:

请注意,域类是实现Serializable所必需的

这项测试将是:

def user = new User(login: "test")
assertNotNull user.save(flush: true)

user = User.get(new User(login: "test"))
assertNotNull user
assertEquals "test", user.login

我假设您正在谈论将字符串主键(通常是自然键)映射到grails域对象中的主键

此答案来源于以下信息: 在这里:

例如,您有一个使用以下架构定义的表用户:

username    varchar(40) not null pimary key,
firstname   varchar(40) not null,
lastname    varchar(40) not null
要在grails中实现这一点,您必须稍微调整一下定义 首先,必须将id映射到数据库中的给定列。使用“已分配”的生成器

然后,为了可用性,您可能需要添加临时字段username,以便可以使用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
  }
}

注意:Scaffolding无法识别瞬态字段,因此如果您想让代码更接近数据库的模型,您必须使用生成的控制器/视图。

您所说的“字段作为登录名”是什么意思?您尝试了什么?您有什么具体问题?@splix,ad ID当然,固定类型,谢谢您的提及。@splix,编辑了问题,添加示例谢谢!我看你很了解圣杯。您能解释一下,为什么在这种情况下通过错误使用域类的exists方法吗?
username    varchar(40) not null pimary key,
firstname   varchar(40) not null,
lastname    varchar(40) not null
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
  }
}