为什么休眠不设置默认@DynamicInsert

2022-09-01 22:51:03

任何人都可以向我解释为什么Hibernate默认情况下不设置注释,并允许实体根据当前设置的属性生成INSERT?@DynamicInsert

默认情况下不使用并因此包含所有实体属性的原因是什么?@DynamicInsert


答案 1

@jb-尼泽特说。

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

从生成的SQL中跳过空字段,很快你会发现自己将声明列,这实际上会导致持久性数据与休眠所知道的实体数据不同。这将导致挫败感,并可能使您求助于昂贵的电话。not null defaultsession.refresh()

例如,假设列

MESSAGE varchar(64) not null default ''

,然后保存映射到此列的属性的空值实体。

使用动态插入,您最终会得到一个实体,该实体对内存中的属性消息具有空值,同时相应的数据库行具有“”。

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


答案 2

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

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

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

  • 不能重用服务器端和客户端预准备语句
  • 它降低了从批处理更新中受益的可能性],因为语句可能会从一个实体更改为另一个实体。

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


推荐