grails中的字符串ID - 如何完成?

时间:2011-10-06 15:04:44

标签: grails groovy gorm

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

这是我试图让你相信我不只是懒得等待某人去做这件事的尝试之一)))

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

  static constraints = { 
  }

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

}

2 个答案:

答案 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
  }
}

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