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

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

http://blog.csdn.net/hongshan50/article/details/7362339

顺着源码,找到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了。可以自己看一下。

不好意思 刚没看懂你问题:
顺着源码,找到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);就是从主键策略中获取。