hibernate中session.save()方法

session.save(c)会将瞬时对象转换成持久化对象,但是c对象并没有主键,在配置文件中配置了主键生成策略为native,执行session.save(c)会发出insert语句,在commit方法那里打了断点,看到此时的id是有值的,但是此时数据库中并没有数据,session缓存里面的c是如何有id的?

@Test
public void test2(){
    Configuration conf = new Configuration().configure();
    SessionFactory sessionFactory = conf.buildSessionFactory();
    Session session = sessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    Customer c = new Customer();
    c.setCust_name("测试");
    session.save(c);
    
    tx.commit();
    session.close();
}

阅读 3.8k
2 个回答

生成Id的源码

protected Serializable saveWithGeneratedId(
            Object entity,
            String entityName,
            Object anything,
            EventSource source,
            boolean requiresImmediateIdAccess) {
        EntityPersister persister = source.getEntityPersister( entityName, entity );
        Serializable generatedId = persister.getIdentifierGenerator().generate( source, entity );//generatedId就是实体的Id
        if ( generatedId == null ) {
            throw new IdentifierGenerationException( "null id generated for:" + entity.getClass() );
        }
        else if ( generatedId == IdentifierGeneratorHelper.SHORT_CIRCUIT_INDICATOR ) {
            return source.getIdentifier( entity );
        }
        else if ( generatedId == IdentifierGeneratorHelper.POST_INSERT_INDICATOR ) {
            return performSave( entity, null, persister, true, anything, source, requiresImmediateIdAccess );
        }
        else {

            if ( log.isDebugEnabled() ) {
                log.debug(
                        "generated identifier: " +
                                persister.getIdentifierType().toLoggableString( generatedId, source.getFactory() ) +
                                ", using strategy: " +
                                persister.getIdentifierGenerator().getClass().getName()
                        //TODO: define toString()s for generators
                );
            }

            return performSave( entity, generatedId, persister, false, anything, source, true );
        }
    }

insert执行成功就会返回id,这时候还没有commit,所以数据库里还看不到

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题