【问题标题】:String IDs in grails - how exactly can it be done?grails 中的字符串 ID - 它究竟是如何完成的?
【发布时间】:2011-10-06 15:04:43
【问题描述】:

有人可以向我展示清晰、完整、100% 的工作方式,在 grails 中将字符串类型字段设置为 ID 吗?我阅读了文档,然后阅读了网络上所有类似的咆哮,但未能创建一个有效的原型。

这是我试图让你相信我不只是懒洋洋地等待某人做这项工作的尝试之一)))

    class User {
  String login
  static hasMany = [apps : Application]

  static constraints = { 
  }

  static mapping = { 
    id generator: 'assigned', name: "login"
  }

}

【问题讨论】:

  • “作为登录的字段”是什么意思?
  • 你尝试过什么,你有什么问题?
  • @splix,当然是广告 ID,固定类型,谢谢提及。
  • @splix,编辑问题,添加示例

标签: grails groovy grails-orm


【解决方案1】:

当您使用自然 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']
    }
}

注意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

【讨论】:

  • 谢谢!我看到你对 grails 了解很多。你能解释一下,为什么在这种情况下使用域类的exists方法通过错误?
【解决方案2】:

我假设您正在谈论将字符串主键(通常是自然键)映射到 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 映射到数据库中的给定列。使用“分配”生成器

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

注意:脚手架无法识别瞬态字段,因此如果您希望代码更紧密地为数据库建模,则必须使用生成的控制器/视图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-16
    • 2014-04-30
    • 1970-01-01
    相关资源
    最近更新 更多