如何在Grails中为生成的id设置约束条件

问题描述:

我有一个用户表,并希望使用username(这是一个电子邮件地址)作为id字段,所以我使用生成的:'assigned'映射来做到这一点。 。添加约束用户名字段才能作为有效的电子邮件地址,但不是强制这里是我的用户等级:如何在Grails中为生成的id设置约束条件

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中手动添加用户名时,它允许我添加任何字符串。

如何执行电子邮件约束?

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

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

当您尝试save()对象的约束才会被检查,所以没有理由相信任何不妥,如果你只是执行:

someUser.username = 'notAnEmailAddress' 

要检查约束是否工作正常添加以下行

if (someUser.save()) { 
    println 'error: constraints not working' 

} else { 
    println 'success: save failed because of errors $user.errors' 
}