【问题标题】:How to set constraints for generated id in Grails如何在 Grails 中为生成的 id 设置约束
【发布时间】:2012-02-20 17:04:17
【问题描述】:

我有一个用户表,想使用用户名(这是一个电子邮件地址)作为 id 字段,所以我使用生成的:'assigned" 映射来执行此操作。我还添加了用户名字段的约束被验证为电子邮件地址,但这不是强制的。这是我的用户类:

class User {

transient springSecurityService

String username
String password
String firstName
String lastName

static hasMany = [accounts: Account]
static hasOne = [company:Company]
static belongsTo = Company

static constraints = {
    username blank: false, unique: true, email: true
    password blank: false
    accounts nullable:true
}   

static mapping = {
    password column: '`password`'
    id generator:'assigned', name:'username', property:'username'
}

基本上,我试图将用户的电子邮件用作 id 字段,并将其用作与其他对象的关系中的外键(作为用户与 Account 的一对多关系),但是当我尝试在 dbconsole 中手动添加用户名,它可以让我添加任何字符串。

如何强制执行电子邮件限制?

【问题讨论】:

    标签: hibernate grails


    【解决方案1】:

    您需要记住,在尝试使用 GORM 插入数据库之前使用了约束和验证框架。如果您直接使用 dbconsole,则您将直接插入到数据库中,并且您正在跳过验证框架。

    如果您需要验证数据库中的电子邮件,您可以在表中定义一个 BEFORE INSERT TRIGGER。但这将是特定于数据库的。

    【讨论】:

      【解决方案2】:

      仅当您尝试save() 对象时才会检查约束,因此如果您只是执行,没有理由相信有任何问题:

      someUser.username = 'notAnEmailAddress'
      

      要检查约束是否有效,请添加以下行

      if (someUser.save()) {
        println 'error: constraints not working'
      
      } else {
        println 'success: save failed because of errors $user.errors'
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-22
        • 1970-01-01
        • 1970-01-01
        • 2018-07-19
        • 1970-01-01
        相关资源
        最近更新 更多