所以我理解dynamic-update = true这个属性的设置是什么,即它只考虑那些被修改的字段,并省略了为其他字段设置空值的工作.节省开销,提高性能.
出于好奇心问:hibernate如何知道所有字段都被修改了?在触发更新查询之前,它是否首先将select查询生成的结果与数据库进行比较?假设是,那么不是比较性能的开销吗?
如我错了请纠正我.提前致谢!
所以经过近两个月的等待,我终于能够得出这个结论,作为我自己问题的答案,并得到各方面的帮助:
1.)使用时dynamic-update
,Hibernate每次都必须生成相应的SQL字符串,因此Hibernate方面会有性能成本.换句话说,在数据库端和Hibernate端的开销之间存在权衡.
2.)Hibernate为每个实体缓存实际的SELECT,INSERT和UPDATE SQL字符串.这导致每次要查找,保留或更新实体时都不必重新创建这些语句.但是,在使用时dynamic-update
,Hibernate每次都必须生成相应的SQL字符串.这导致Hibernate方面的性能成本.
3.)当应用于非常小且简单的表时非常有用,因为使用此注释可以获得显着的性能提升.更现实的情况是,在使用远程数据库的更广泛的表上,性能提升可能更加明显.当然,您获得的里程数会因大多数需要更新的列而异.
4.)@DynamicUpdate annotation/ dynamic-update=true
用于指定每当修改实体时都应生成UPDATE SQL语句.默认情况下,Hibernate使用缓存的UPDATE语句来设置所有表列.当使用注释对实体进行@DynamicUpdate
注释时,PreparedStatement将仅包括其值已更改的列.
总体可归纳为:
运行时SQL生成开销.
没有使用PreparedStatement(缓存)了.
性能开销.
积分:Hibernate的ORM 5.2.7.Final用户指南,http://memorynotfound.com/hibernate-dynamic-update-attriburte-example/ ,/sf/ask/17360801/
PS:对于dynamic-insert=true/ @DynamicInsert
注释也适用