Zer01ne
2016-11-23 01:06
采纳率: 0%
浏览 4.2k

hibernate中,在主键自增策略下,调用save方法是如何给记录设置主键的

hibernate中,在主键自增策略下,调用save方法是如何给记录设置主键的

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

3条回答 默认 最新

  • da cong ming 2016-11-23 02:25
    打赏 评论
  • ServiceGood 2016-11-23 02:39

    顺着源码,找到for(int i = 0; i < saveEventListener.length; i++) saveEventListener[i].onSaveOrUpdate(event);
    onSaveOrUpdate方法接着找Object entity = source.getPersistenceContext().unproxyAndReassociate(object);
    然后unproxyAndReassociate方法的实现中有LazyInitializer li = proxy.getHibernateLazyInitializer();
    getHibernateLazyInitializer通过map映射拿到hibernate配置。然后根据方法reassociateProxy先去mapping里找
    EntityPersister persister = session.getFactory().getEntityPersister(li.getEntityName());//有没有你保存的实体与表的映射。
    没有报错:throw new MappingException("Unknown entity: " + entityName);//很熟悉的错误
    如果有EntityKey key = new EntityKey(li.getIdentifier(), persister, session.getEntityMode());
    li.getIdentifier()//li是之前拿到的hibernate配置。里面包含id策略。这样就加到map里了。后面就操作session了。可以自己看一下。

    打赏 评论
  • ServiceGood 2016-11-23 03:06

    不好意思 刚没看懂你问题:
    顺着源码,找到for(int i = 0; i < saveEventListener.length; i++) saveEventListener[i].onSaveOrUpdate(event);
    onSaveOrUpdate方法接着找Object entity = source.getPersistenceContext().unproxyAndReassociate(object);
    然后unproxyAndReassociate方法的实现中有LazyInitializer li = proxy.getHibernateLazyInitializer();
    getHibernateLazyInitializer通过map映射拿到hibernate配置。然后根据方法reassociateProxy先去mapping里找
    EntityPersister persister = session.getFactory().getEntityPersister(li.getEntityName());//有没有你保存的实体与表的映射。
    没有报错:throw new MappingException("Unknown entity: " + entityName);//很熟悉的错误
    如果有EntityKey key = new EntityKey(li.getIdentifier(), persister, session.getEntityMode());
    li.getIdentifier()//li是之前拿到的hibernate配置。里面包含id策略。这样就加到map里了。后面接着
    event.setResultId(performSaveOrUpdate(event)); performSaveOrUpdate方法中return entityIsTransient(event);//插入
    这里就是你要的此方法中 有一个获取id的方法: Serializable id = saveWithGeneratedOrRequestedId(event);

    找到Serializable generatedId = persister.getIdentifierGenerator().generate(source, entity);就是从主键策略中获取。

    打赏 评论

相关推荐 更多相似问题