Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/grails/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 嵌入子类上的约束-Grails、GORM、Mongo_Mongodb_Grails_Constraints_Gorm - Fatal编程技术网

Mongodb 嵌入子类上的约束-Grails、GORM、Mongo

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

这几天来,我一直在为这个问题发牢骚

我有一个带有几个指定约束的嵌入式子类。我的问题是这些约束从未被强制执行, 我正在使用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 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我尝试了你的建议,但不幸地没有成功。