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

时间:2014-02-12 07:54:19

标签: java sql hibernate jpa orm

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

3 个答案:

答案 0 :(得分:8)

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

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

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

答案 1 :(得分:7)

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

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

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

答案 2 :(得分:6)

@ jb-nizet说的是什么。

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

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

例如假设列

MESSAGE varchar(64) not null default ''

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

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

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