Mongodb 嵌入子类上的约束-Grails、GORM、Mongo
这几天来,我一直在为这个问题发牢骚 我有一个带有几个指定约束的嵌入式子类。我的问题是这些约束从未被强制执行, 我正在使用Grails2.3.11和mongodb插件3.0.2 这是我的设置(稍微简化) 媒体课Mongodb 嵌入子类上的约束-Grails、GORM、Mongo,mongodb,grails,constraints,gorm,Mongodb,Grails,Constraints,Gorm,这几天来,我一直在为这个问题发牢骚 我有一个带有几个指定约束的嵌入式子类。我的问题是这些约束从未被强制执行, 我正在使用Grails2.3.11和mongodb插件3.0.2 这是我的设置(稍微简化) 媒体课 class Media{ ObjectId id; String name; Film film; static mapWith = "mongo" static embedded = ["film"] } 电影课 class Film{ ObjectId id; String nam
class Media{
ObjectId id;
String name;
Film film;
static mapWith = "mongo"
static embedded = ["film"]
}
电影课
class Film{
ObjectId id;
String name;
static mapWith = "mongo"
static belongsTo = [media : Media]
static mapping = {
lazy:false
}
static constraints = {
name(nullable:false) //works as expected. Save fails if name is set to null
}
}
动作片班
class ActionFilm extends Film{
int score;
String director;
//These constraints are never enforeced. No matter what value I set the fields to the save is always successful
static constraints = {
score(min:50)
director(nullable:true)
}
}
这是Mongo和Gorm的问题吗?在父类和子类中是否可能有约束
保存时的示例代码
public boolean saveMedia(){
ActionFilm film = new ActionFilm()
film.setName("TRON");
film.setScore(2)
film.setDirector("Ted")
Media media = new Media()
media.setName("myMedia")
media.setFilm(film)
media.save(flush:true, failOnError:false) //Saves successfully when it shouldn't as the score is below the minimum constrains
}
编辑
我已经玩了很多次了,只有当我将ActionFilm作为嵌入对象保存媒体对象时,问题才会出现。如果我保存ActionFilm对象,将应用验证
ActionFilm film = new ActionFilm()
film.setName("TRON");
film.setScore(2)
film.setDirector("Ted")
film.save(flush:true, failOnError:false) //Doesn't save as the diameter is wrong. Expected behaviour.
因此,当我保存ActionFilm对象时,会按预期应用约束,但如果它是嵌入对象,则不会应用约束 我已经解决了我的问题,以防其他人遇到这个问题。这可能不是最佳解决方案,但我还没有找到替代方案 我已经向媒体类添加了一个自定义验证器,该类在嵌入的Film类上调用validate(),并添加由媒体对象错误引起的任何错误
class Media{
ObjectId id;
String name;
Film film;
static mapWith = "mongo"
static embedded = ["film"]
static constraints = {
film(validator : {Film film, def obj, def errors ->
boolean valid = film.validate()
if(!valid){
film.errors.allErrors.each {FieldError error ->
final String field = "film"
final String code = "$error.code"
errors.rejectValue(field,code,error.arguments,error.defaultMessage )
}
}
return valid
}
)
}
在ActionFilm的约束块中尝试导入电影中的
。@user1690588我尝试了你的建议,但不幸地没有成功。