我有一个应用程序的方法,由于某种原因,我无法弄清楚,是保存我在控制器方法结束时加载的对象,即使我指定它不应该。
def testMethod( Long id ) {
def target = SampleDomain.read( id );
// use target in a further query, but don't change target at all
// I've checked, and target.isDirty() is false here
target.discard()
render( view: 'blah', model: [ /* this model does NOT contain the target */ ] )
}
出于某种原因,如果我打开logSql,我可以看到目标对象在此方法结束时被保存,即使我使用“read”和“discard”。版本字段似乎是表中唯一要更改的数据库字段。
是否有某种方法来注释方法以确保在控制器方法的会话期间不执行“更新”?我承认不完全了解@Transactional注释的可能参数。
我正在使用Grails v2.2.4。
答案 0 :(得分:1)
这似乎比我想象的要容易。我需要的只是Transactional注释的readOnly参数:
@Transactional(readOnly = true)
def testMethod( Long id ) {
def target = SampleDomain.read( id );
// use target in a further query, but don't change target at all
// I've checked, and target.isDirty() is false here
render( view: 'blah', model: [ /* this model does NOT contain the target */ ] )
}
我仍然不确定为什么在我使用discard()方法后更新对象...但现在我甚至不需要它。