waterlooz 2008-09-17 17:45
浏览 372
已采纳

session.save()会立即同步状态到数据库,不解!

先看代码:
[code="java"]
public static void main(String[] args) throws Exception {
Configuration cfg = new Configuration();
SessionFactory sf = cfg.configure().buildSessionFactory();
Session session = sf.openSession();
//session.setFlushMode(FlushMode.MANUAL);
session.beginTransaction();
Parent p = new Parent();
p.setName("hello");
session.save(p);
System.out.println(1);
p.setName("world");
System.out.println(2);
session.getTransaction().commit();
session.close();
}
[/code]
这是我的一段测试代码,Parent类除了id以外仅有一个name属性,我执行这段代码,在控制台的输出是这样的:
[code="java"]
Hibernate: insert into parent (name) values (?)
1
2
Hibernate: update parent set name=? where id=?
[/code]
我的疑问是,为什么save方法会在打印语句之前将sql语句发送到数据库,是立即执行的,update方法的行为可以理解,提交事务时才同步到数据库,我记得以前save方法也不会立即发送sql的,而是flush或者commit时才会,我用的hibernate是3.3.1.GA版本的,难道是这个原因吗?
当我把session.setFlushMode(FlushMode.MANUAL)的注释去掉之后输出变成了这样:
[code="java"]
Hibernate: insert into parent (name) values (?)
1
2
[/code]
因为没有手动显式调用flush,所有后来的update并没有发出,但是save仍然是立即同步的,不解啊!

  • 写回答

2条回答

  • iteye_18036 2008-09-17 19:07
    关注

    楼主可以看下,save方法返回一个Serializable标识,就是因为这个,所以他要立即执行insert语句,如果想要不执行的话,可以试一下persist方法,persist方法是把一个瞬态的实例持久化,但是并不保证标识符被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时间。这里说的表示就是save方法返回的标识,由于save方法必须立刻把标识填入持久化实例中,所以,它会立刻执行insert语句。
    不知道我说的楼主是否明白。希望对楼主有帮助

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况
  • ¥15 画两个图 python或R