注释Controller方法使Hibernate会话“只读”

时间:2014-02-06 01:01:04

标签: hibernate grails transactional

我有一个应用程序的方法,由于某种原因,我无法弄清楚,是保存我在控制器方法结束时加载的对象,即使我指定它不应该。

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。

1 个答案:

答案 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()方法后更新对象...但现在我甚至不需要它。