鍍金池/ 問答/Java/ hibernate中session.save()方法

hibernate中session.save()方法

session.save(c)會(huì)將瞬時(shí)對象轉(zhuǎn)換成持久化對象,但是c對象并沒有主鍵,在配置文件中配置了主鍵生成策略為native,執(zhí)行session.save(c)會(huì)發(fā)出insert語句,在commit方法那里打了斷點(diǎn),看到此時(shí)的id是有值的,但是此時(shí)數(shù)據(jù)庫中并沒有數(shù)據(jù),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();
}

回答
編輯回答
命多硬

insert執(zhí)行成功就會(huì)返回id,這時(shí)候還沒有commit,所以數(shù)據(jù)庫里還看不到

2017年11月8日 08:01
編輯回答
六扇門

生成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就是實(shí)體的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 );
        }
    }
2017年7月27日 18:19