我有一个更新数据库列的服务。 更新是使用 executeUpdate 完成的。 在服务方法之后的测试中,我正在尝试加载记录。 记录将加载并填充每个字段,除了我刚刚在服务中更新的字段。
更奇怪的是,当我通过浏览器正常运行代码时,它可以完美运行。 我可以查看数据库并看到该字段正在持久化。 只有集成测试不起作用。 它必须是脏字段的某种类型的休眠会话问题。
这是我精简的代码。 我省略了控制器信息。 我的测试调用控制器,控制器调用服务。
class BasicProfile {
static hasMany = [ photos:Photo ]
}
class Photo {
BasicProfile basicProfile
String caption
String publicId
static belongsTo = [ basicPofile:profile ]
}
class PhotoService {
def updateCaption() {
...
Photo.executeUpdate("update Photo p set p.caption = ? where p.basicProfile.id = ? and p.publicId = ? ",
[newCaption, profile.id, publicId])
...
}
}
void testUpdateCaption() {
...
controller.updateCaption() //controller just calls the photoService method
//get json result from controller to load publicId
...
Photo photo = Photo.findByPublicId(publicId)
assertEquals "my new caption", photo.caption //photo.caption is null, but the rest of the photo object is populated properly from the database load
}
我在断言上添加了一个断点,以便我可以查看照片实例。 这是一个有效的实例,每个字段都填充了创建时的数据(在调用controller.updateCaption()之前)。 但是在调用 controller.updateCaption() 之后,caption 字段应该具有有效数据,但它仍然是 null(创建实例时的默认值)。
这可能是您的域实例的缓存,请尝试以下操作:
void testUpdateCaption() {
controller.updateCaption()
//force the query in a clean hibernate session
Photo.withNewSession {
def photo = Photo.findByPublicId(publicId)
assertEquals "my new caption", photo.caption
}
}