为什么hibernate在保存之前进行选择?

为什么hibernate在保存之前进行选择?,hibernate,optimization,Hibernate,Optimization,为什么hibernate在保存对象之前进行选择 我在网上找不到有用的信息。在每次保存之前,这是正常的行为吗?我找到了这个主题,-保存,但我不认为这个答案是确定的。我的意思是,如果我想在保存每个对象之前避免这个选择,我们必须使用版本控制吗 我将感谢所有的解释或链接。不,它不会在保存前进行选择。你确定你的编辑保存用例是正确的吗?webapps的一个常见流程是: 用户单击获取/产品/5/编辑 服务器将Product5提取到http会话中 服务器返回用于编辑Product5的html表单 用户提交邮件表

为什么hibernate在保存对象之前进行选择

我在网上找不到有用的信息。在每次保存之前,这是正常的行为吗?我找到了这个主题,-保存,但我不认为这个答案是确定的。我的意思是,如果我想在保存每个对象之前避免这个选择,我们必须使用版本控制吗


我将感谢所有的解释或链接。

不,它不会在保存前进行选择。你确定你的编辑保存用例是正确的吗?webapps的一个常见流程是:

用户单击获取/产品/5/编辑 服务器将Product5提取到http会话中 服务器返回用于编辑Product5的html表单 用户提交邮件表单 服务器从http会话获取Product5 服务器根据请求填充它 服务器将已填充的Product5合并回hibernate
将执行一个sql更新,该更新还处理版本控制。如果版本号不同步,将抛出StaleObjectStateException。

我知道您已经在问题的注释中回答了自己的问题,但这里总结了一些要点

为了澄清这一点,NHibernate在“SQL插入”中使用“保存”,在“SQL更新”中使用“更新”

我知道当NHibernate在持久化对象之前隐式地从db中获取对象而不显式地使用s.Update时,会出现以下常见情况:

根据映射中的设置,在会话\u刷新/事务\u提交时,将更新前选择设置为true; 使用SaveOrUpdate时,实例的标识符有一个值,表明它存在于数据库中; 在s.Delete之前。
与您的示例一样,当使用父子对象时,这可能不明显,但简单规则保持不变,因为从代码中可能看不到将获取子对象

因此Julia是对的,使用分配了ID的实体调用Session.save会导致hibernate执行选择,然后执行插入。幸运的是,有两种解决办法:

不要预先分配你的身份证对我来说不是一个选项 调用Session.persist而不是Session.save 第二个选项也可以无缝地与Envers配合使用


希望这能为其他人节省几个小时的狩猎时间。

嗨,谢谢你的回答。我清楚地看到它发生在保存之前。所以,我只是创建新对象,然后在dao中执行getHibernateTemplate.saveobject。我在日志中看到,他以前确实选择过。我看不出与更新混淆的原因:/OK,我很困惑,因为您提到了版本控制。我添加了一个版本栏,因为我在hibernate论坛上读到,他们说为了避免这种情况,请在保存之前选择,应该添加version列,以便hibernate知道对象是否是瞬态的,然后他不进行选择。但我仍然无法理解,如果我调用SAVE,为什么他必须这样做。您是如何在映射中添加version列的?请提供来源。@cherouvim:我添加了该列以阻止此选择。下面是如何显示select语句的一部分?您使用哪个版本的Hibernate?您确定要调用save,而不是saveOrUpdate吗?另外,添加版本控制后选择是否消失?@cherouvim@axtavt感谢您的回复!我的错我的错,我有一个子对象有指定的ID,我将它们添加到父对象,然后保存父对象,所以在保存之前,hibernate必须选择这些子对象,因为它不知道它们是否在数据库中,因为它们的ID:/谢谢帮助。我现在如何回答这个问题是的,在分配ID的情况下,选择确实会发生,并且在那里它确实有意义,但我的ID是自动生成的…无论如何,问题已经解决。但是我现在要用谷歌搜索session.persist做什么,因为我从来没有用过它。谢谢你!为我节省了数小时的搜索时间以优化批量保存。