为什么Hibernate默认设置动态insert = false

任何人都可以向我解释为什么Hibernate默认设置Dynamic insert = false ,这是什么原因?

什么@ jb-nizet说。

另外,在我的书中, dynamic-insert="true"是一个坏主意。

从生成的SQL中删除空字段,很快就会发现自己处于一种情况,即你将声明列not null default ,这实际上导致持久数据与hibernate知道的实体数据不同。 这会导致沮丧,并可能使您诉诸昂贵的session.refresh()调用。

例如,假设列

 MESSAGE varchar(64) not null default '' 

并为映射到此列的属性保存具有空值的实体。

使用dynamic-insert,您将得到一个实体,该实体在内存中具有属性消息的空值,同时相应的数据库行具有”。

我希望我有道理。 特别是如果您正在考虑针对这种情况进行动态插入(为了避免必须为非空列设置所有属性并依赖于默认约束),请再想一想。

动态插入和更新非常有用,原因有两个:

  • 在非重叠写入关注属性集上减少OptimisticLockException误报
  • 避免与更新索引相关的一些处理开销

但是,动态插入/更新也有缺点:

  • 您无法重用服务器端和客户端准备好的语句
  • 它降低了从批量更新中受益的可能性,因为该语句可能会从一个实体更改为另一个实体。

所以,没有好方法或坏方法。 它只取决于您的数据访问模式,以确定这两个中哪一个对给定实体有意义。

因为插入实体时跳过空字段不会增加任何显着的性能改进。

相反,它可能会降低性能,因为Hibernate不是总能使用相同的预准备语句在表中插入行,而是能够在单个批处理中执行多个插入,而是必须为每个批处理创建一个特定的预处理语句。要插入的实体,它取决于null的字段和不是的字段。

因此,更复杂,降低性能。