当我使用BootStrap的服务时,我发现奇怪的行为。考虑这些域类
AcademicUnit教授
UnitFaculty学生
我在Student和AcademicUnit之间有一个1:M关系,在AcademicUnit和Professor之间有一个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