2013-02-16 58 views
1

我用Grails的,它使用Hibernate持久性的引擎盖下。我应该依靠脏检查吗?

我的问题是,如果它是一个很好的做法,依靠脏检查,或者我应该总是明确地调用save()方法实体每次我改变它们?

UPD:这个问题不是关于肮脏的检查机制,这个问题是关于它的可靠性。也就是说,当我想更新实体:

def user = User.get(1) 
user.name = 'new name' 
user.save() //optional 

我可以ommit最后一行,Hibernate会检测自身的变化和坚持,但我可以100%肯定吗?

你永远地调用在你的项目更新后,保存()?

+0

这听起来像你需要阅读什么保存意味着当你使用Hibernate。 – 2013-02-16 18:59:37

回答

0

所有实体插入& updations使用Session.save() & Session.saveOrUpdate()

除非,除非你火与在session保存,他们不是不打算在DataBase被保存了保存。

一旦你保存的对象,仍然要修改的对象Hibernate的Dirty checking将进入画面。

dirty checking,hibernate自动检测对象是否被修改(或)不需要更新。只要对象是在persistent state即 绑定到特定会话(的org.hibernate.Session)。 Hibernate监视对象的任何更改并执行sql。

0

这里是脏检查一些研究

  1. Fush会议将重置偏多状态

    高清病人= Patient.get(ID)

    patient.name = 'XXX'

    patient.isDirty() - > true

    patient.save()

    patient.isDirty() - >真

    patient.save(冲洗:真)

    patient.isDirty() - >假!!冲洗将重置原点状态

  2. HQL查询也将复位原点SATE

    DEF患者= Patient.get(ID)

    patient.name = 'xxx' 的

    patient.isDirty( ) - >真

    Patient.findByXXXX()

    患者。isDirty() - > false

+0

[grails-issue-not-processed-by-flush-root-causes](http://naleid.com/blog/2010/11/21/grails-issue-not-processed-by-flush-root-causes ) – 2016-12-01 01:59:13