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

Ven*_*esh 10 java sql orm hibernate jpa

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

Vla*_*cea 8

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

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

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


JB *_*zet 7

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

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

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

  • 它不仅仅是准备好的陈述.它也是关于Sql Server(可能还有其他DBMS)中的查询缓存.它会记住查询是否完全相同并且不会再次编译.如果插入每次都不同,它必须再次编译它并填满其"最常用"的缓存,使其无法使用. (2认同)

dka*_*ros 6

什么@ jb-nizet说.

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

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

例如,假设列

MESSAGE varchar(64) not null default ''
Run Code Online (Sandbox Code Playgroud)

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

使用dynamic-insert,您将得到一个实体,该实体在内存中具有null值,同时相应的数据库行具有''.

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