【发布时间】:2018-05-25 22:57:57
【问题描述】:
我想知道 Hibernate 会话如何识别数据库中是否已经存在对象。 因为在我的情况下,新记录总是被保存而不更新。
【问题讨论】:
我想知道 Hibernate 会话如何识别数据库中是否已经存在对象。 因为在我的情况下,新记录总是被保存而不更新。
【问题讨论】:
据我所知,休眠会话将根据主键列识别对象。例如,ID 是表中的主键列,您为传递对象的 ID 参数设置了一些值。会话将检查映射表 ID 值是否存在。如果存在,它将相应地调用 update(object) 否则 save(object) 方法。
有关更多信息,请参阅此documentation 链接。
【讨论】:
您总是在新记录上保存的原因是因为持久性提供程序总是将该对象视为TRANSIENT。当一个被传递到保存或更新时,它还没有在持久化上下文中,hibernate 会尝试为它生成一个 id(如果使用@GeneratedValue)并将该对象/实体添加到持久化上下文中它具有的点成为托管。
这是来自 5.x hibernate impl 的 sn-p:
public class DefaultSaveEventListener extends DefaultSaveOrUpdateEventListener {
protected Serializable performSaveOrUpdate(SaveOrUpdateEvent event) {
EntityEntry entry = event.getSession().getPersistenceContext().getEntry( event.getEntity() );
if ( entry!=null && entry.getStatus() != Status.DELETED ) {
return entityIsPersistent(event);
}
else {
return entityIsTransient(event);
}
}
在您的情况下,EntityEntry entry 被解析为 null 并调用 entityIsTransient(event);。其中包含:
Serializable id = saveWithGeneratedOrRequestedId( event );
source.getPersistenceContext().reassociateProxy( event.getObject(), id );
这正是我之前指出的。
【讨论】: