当使用一个类来建模M:M关系时,Grails 2.0在Bootstrap中提供了不同的行为



当我使用BootStrap的服务时,我发现奇怪的行为。考虑这些域类

AcademicUnit教授
UnitFaculty学生

我在StudentAcademicUnit之间有一个1:M关系,在AcademicUnitProfessor之间有一个M:N关系,我正在使用join类UnitFaculty进行建模。UnitFaculty类使用与Spring Security Core提供的UserRole类相同的基本方法,所以我认为这种方法没有问题。

我有从一个学术单位查询学生和教员的服务。

ProfessorServiceStudentService

从概念上讲,它们做同样的事情,并且它们在应用程序运行时都工作得很好。

我试图在Bootstrap中预填充一些数据。这个问题出现在ResearchCreation中。相关的代码片段是:

private static void addASUEngineeringAffiliated(){
    def students = studentService.getASUEngineeringEducationStudents()
    students.each{
        def researcher = Researcher.findByName(it.name) ?:
            new Researcher(name:it.name, email:it.email).save(failOnError:true)
    }
    def faculty = professorService.getASUEngineeeringEducationFaculty()
    println "faculty is ${faculty}"
    faculty.each{
        def researcher = Researcher.findByName(it.name) ?:
            new Researcher(name:it.name, email:it.email).save(failOnError:true)
    }
}

当我启动应用程序时,println显示faculty是一个空列表。但是,当稍后在控制器中调用相同的服务方法时,它返回相关的教员,这些教员是在此之前的Bootstrap过程的一个步骤中加载的。数据应该是可用的。这是为学生准备的,他们以前也加载过。

这是预期的行为,我不理解在引导过程中使用组合键的M:N的后果,还是一个bug?

我认为你的问题是Hibernate优化。尝试在保存时使用flush:true参数。见http://grails.org/doc/2.0.x/ref/Domain%20Classes/save.html

最新更新