我应该依赖脏检查吗?

时间:2013-02-16 12:38:27

标签: hibernate grails gorm

我使用Grails,它使用Hibernate来持久存在。

我的问题是,如果依靠脏检查是一种好习惯,还是每次更改实体时都应该总是在实体上明确调用save()方法?

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

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

我可以省略最后一行,Hibernate将自己检测变化并坚持下去,但我能100%肯定吗?

您是否总是在项目更新后明确调用save()?

2 个答案:

答案 0 :(得分:0)

使用Session.save()&保存所有实体插入和更新。 Session.saveOrUpdate()

除非您使用session启动保存,否则它们将不再保存在DataBase中。

保存对象后,您仍在修改对象,Hibernate的Dirty checking将会出现在图片中。

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

答案 1 :(得分:0)

以下是一些关于脏检查的研究

  1. Fush会话将重置原始状态

    def patient = Patient.get(id)

    patient.name =' xxx'

    patient.isDirty() - >真

    patient.save()

    patient.isDirty() - >真

    patient.save(flush:true)

    patient.isDirty() - >假!! flush将重置原始状态

  2. Hql查询也将重置原始状态

    def patient = Patient.get(id)

    patient.name =' xxx'

    patient.isDirty() - >真

    Patient.findByXXXX()

    patient.isDirty() - >假的