【问题标题】:How Hibernate SaveOrUpdate(beanobject) method identifies that the given beanobject exist or notHibernate SaveOrUpdate(beanobject) 方法如何识别给定的 beanobject 是否存在
【发布时间】:2018-05-25 22:57:57
【问题描述】:

我想知道 Hibernate 会话如何识别数据库中是否已经存在对象。 因为在我的情况下,新记录总是被保存而不更新。

【问题讨论】:

标签: java hibernate orm


【解决方案1】:

据我所知,休眠会话将根据主键列识别对象。例如,ID 是表中的主键列,您为传递对象的 ID 参数设置了一些值。会话将检查映射表 ID 值是否存在。如果存在,它将相应地调用 update(object) 否则 save(object) 方法。

有关更多信息,请参阅此documentation 链接。

【讨论】:

    【解决方案2】:

    您总是在新记录上保存的原因是因为持久性提供程序总是将该对象视为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 );
    

    这正是我之前指出的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-26
      • 1970-01-01
      • 2015-12-11
      • 1970-01-01
      • 2019-08-23
      • 2013-05-12
      • 1970-01-01
      相关资源
      最近更新 更多