Java 在Hibernate中使用saveOrUpdate更新对象

Java 在Hibernate中使用saveOrUpdate更新对象,java,hibernate,Java,Hibernate,我熟悉Hibernate。我有个问题 假设我执行会话。保存或更新(对象)。如果对象包含一些“id”(对象标识符),则表示如果修改了对象,将触发更新查询 我想知道Hibernate是如何做到这一点的,即对象中可能有“n”个字段。Hibernate是否检查每个字段,以了解是否有任何字段被修改(在本例中,将触发更新查询)?使用use.saveOrUpdate()时它将检查对象是否没有标识符属性,如果没有,它将通过生成标识符并将其分配给会话使其持久化 如果该对象在此会话中已持久化,则在以下情况下不执行任

我熟悉Hibernate。我有个问题

假设我执行
会话。保存或更新(对象)
。如果对象包含一些“id”(对象标识符),则表示如果修改了对象,将触发更新查询


我想知道Hibernate是如何做到这一点的,即对象中可能有“n”个字段。Hibernate是否检查每个字段,以了解是否有任何字段被修改(在本例中,将触发更新查询)?

使用use
.saveOrUpdate()时
它将检查对象是否没有标识符属性,如果没有,它将通过生成标识符并将其分配给会话使其持久化

如果该对象在此会话中已持久化,则在以下情况下不执行任何操作: 与会话关联的另一个对象具有相同的标识符, 如果对象没有identifier属性,则引发异常,并将其保存() 如果对象的标识符的值已分配给新的 实例化对象,如果对象由 或者,并且版本属性值相同 指定给新实例化对象的值,否则保存() 更新()对象


如果对象没有调用Save()的标识符,它将检查映射为给定对象标识符的字段,Save()插入对象,如果有,它将调用Update()如果您将对象设置为唯一标识符,则它将在hibernate中更新它,它将通过调用
session.saveOrUpdate()


或者,如果未找到唯一标识符,则插入数据。

因此,即使未修改任何字段,仍将触发更新查询?是,它将触发。因为它将只检查标识符字段OK。我认为,如果未修改任何字段,则不会触发更新。这不是性能问题吗??我的意思是,如果字段中没有更改,那么为什么要启动更新查询..据我所知,它只检查id。在这种情况下你是对的。更新是不必要的。但它不是那样工作的。你可以通过将show_sql设置为true来观察nHibernate会话跟踪需要写入数据库的内容,如果提交事务,它只更新已更改的对象或插入新对象。