我想知道Hibernate会话如何识别对象是否已经存在于DB中。 因为在我的情况下,新记录总是被保存而不是更新。
答案 0 :(得分:0)
据我所知,hibernate Session将根据Primary Key列识别对象。比方说,例如,ID是表中的主键列,并且您已经为传递对象的ID参数设置了一些值。会话将检查映射表ID值是否存在。如果存在,它将调用更新(对象),否则相应地保存(对象)方法。
有关详细信息,请参阅此documentation链接。
答案 1 :(得分:0)
之所以,您总是最终保存新记录是因为持久性提供程序始终将该对象视为TRANSIENT
。当一个传递给保存或更新时,它还没有在持久化上下文中,并且hibernate尝试为它生成一个id(如果使用@GeneratedValue
)并将该对象/实体添加到持久化上下文中它已成为管理。
这是来自5.x hibernate impl的片段:
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 );
这正是我之前指出的。