代码:
Configuration config = new Configuration().configure();
Session sess = config.buildSessionFactory().openSession();
Transaction trans = sess.beginTransaction();

userType type = new userType();
type.setId(1);
userInfo info = new userInfo("asdfeee","bb","ddd","eee","fff",true,type);

System.out.println("调用save方法");
sess.save(info);

System.out.println("提交事务");
trans.commit();
sess.close();在映射主键时,选择的增长方式是increment:
<id name="id" column="id" type="int">
<generator class="increment"></generator>
</id>输出是:调用save方法
Hibernate: 
    select
        max(id) 
    from
        userInfo
提交事务
Hibernate: 
    /* insert entity.userInfo
        */ insert 
        into
            userInfo
            (username, password, address, phone, sex, email, userType, id) 
        values
            (?, ?, ?, ?, ?, ?, ?, ?)这时,“提交事务”这四个字在insert语句的前面。现在,将increment改成native,
<id name="id" column="id" type="int">
<generator class="native"></generator>
</id>
然后在表里将id列设为自动标识。
再次执行上面的代码,输出是:调用save方法
Hibernate: 
    /* insert entity.userInfo
        */ insert 
        into
            userInfo
            (username, password, address, phone, sex, email, userType) 
        values
            (?, ?, ?, ?, ?, ?, ?)
提交事务这时,“提交事务”这四个字跑到了insert的后面去了。
为什么呢?只不过是换了一个主键的生成方式而已!
save方法生成的SQL到底是什么时候被执行的?
谢谢回答!

解决方案 »

  1.   

    如果对象使用native方式来生成ID(持久化标识)的话,它们一执行save就会被插入数据库
    也就是到
     sess.save(info);
    这一步,就与数据库发生了实质性的交互
    所以你后看到的是 Hibernate: 
        /* insert entity.userInfo
            */ insert 
            into
                userInfo
                (username, password, address, phone, sex, email, userType) 
            values
                (?, ?, ?, ?, ?, ?, ?)
    提交事务当你用
     <id name="id" column="id" type="int">
                <generator class="increment"></generator>
        </id>
    时侯,他先与数据库交互找大最大的 id
    后来执行
     sess.save(info);
    这一句,,注意他并没提交事务,只是写到缓存中去了
    只有到
     trans.commit();
    才提交事务
    所以你在显示
    提交事务
    之后才出现sql语句,,
    Hibernate: 
        /* insert entity.userInfo
            */ insert 
            into
                userInfo
                (username, password, address, phone, sex, email, userType, id) 
            values
                (?, ?, ?, ?, ?, ?, ?, ?)
      

  2.   

    有空好好的看看Hibernate 工具文挡,,它那将的很清楚