我使用Grails,它使用Hibernate来持久存在。
我的问题是,如果依靠脏检查是一种好习惯,还是每次更改实体时都应该总是在实体上明确调用save()
方法?
UPD:这个问题不是关于脏检查机制,这个问题是关于它的可靠性。也就是说,当我想要更新实体时:
def user = User.get(1)
user.name = 'new name'
user.save() //optional
我可以省略最后一行,Hibernate将自己检测变化并坚持下去,但我能100%肯定吗?
您是否总是在项目更新后明确调用save()?
答案 0 :(得分:0)
使用Session.save()
&保存所有实体插入和更新。 Session.saveOrUpdate()
除非您使用session
启动保存,否则它们将不再保存在DataBase
中。
保存对象后,您仍在修改对象,Hibernate的Dirty checking
将会出现在图片中。
在dirty checking
中,hibernate
会自动检测对象是否被修改(或)不需要更新。只要对象在persistent state
即,
绑定到特定的Session(org.hibernate.Session)。 Hibernate监视对象的任何更改并执行sql。
答案 1 :(得分:0)
以下是一些关于脏检查的研究
Fush会话将重置原始状态
def patient = Patient.get(id)
patient.name =' xxx'
patient.isDirty() - >真
patient.save()
patient.isDirty() - >真
patient.save(flush:true)
patient.isDirty() - >假!! flush将重置原始状态
Hql查询也将重置原始状态
def patient = Patient.get(id)
patient.name =' xxx'
patient.isDirty() - >真
Patient.findByXXXX()
patient.isDirty() - >假的