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

问题描述

先看代码: 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(); }这是我的一段测试代码,Parent类除了id以外仅有一个name属性,我执行这段代码,在控制台的输出是这样的:Hibernate: insert into parent (name) values (?)12Hibernate: update parent set name=? where id=?我的疑问是,为什么save方法会在打印语句之前将sql语句发送到数据库,是立即执行的,update方法的行为可以理解,提交事务时才同步到数据库,我记得以前save方法也不会立即发送sql的,而是flush或者commit时才会,我用的hibernate是3.3.1.GA版本的,难道是这个原因吗?当我把session.setFlushMode(FlushMode.MANUAL)的注释去掉之后输出变成了这样:Hibernate: insert into parent (name) values (?)12因为没有手动显式调用flush,所有后来的update并没有发出,但是save仍然是立即同步的,不解啊!

解决方案

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

时间: 2024-10-06 10:38:24

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

ASP.NET 中 Session 实现原理浅析 [2] 状态管理器

asp.net|session 状态管理本来是一件很美好的事情,嘿嘿,只可惜总是有些厂商在实现的时候考虑得不那么周全.例如 MS 在 ASP 中的状态管理实现就比较烂,因为只实现了一个进程内的基于内存的状态管理,故而存在很多问题: 1.所有的 Session 数据都保存在 Web 服务的进程中,会造成服务器支持会话数量受到服务器内存资源的限制问题,同时也因为大量非活动会话导致内存被无效占用. 2.服务器进程崩溃会导致所有的会话数据丢失. 3.会话无法跨进程或在负载均衡情况下使用,除非负载均衡技术

用Java实现可保存状态的数据库生成XML树(1)-基于weblogic,包括一些基础问题,非常详细的。

web|xml|生成xml|数据|数据库|问题 用Java实现可保存状态的数据库生成XML树目录  0.    关键字词注释    11.    目的    12.    设计思想    13.    实现概要    14.    实现步骤    24.1.XML文档结构定义    24.2.数据表的结构定义    44.3.构造生成XML的servlet    44.4.构造显示树型结构的XSL模版    84.5.构造生成点击树型XMl显示详细节点内容的Servlet    124.6.Se

php在linux下检测mysql同步状态的方法

 这篇文章主要介绍了php在linux下检测mysql同步状态的方法,是Linux下使用php检测mysql同步状态的实用技巧,具有一定参考借鉴价值,需要的朋友可以参考下     本文实例讲述了php在linux下检测mysql同步状态的方法.分享给大家供大家参考.具体分析如下: 这里通过两个实例来介绍mysql同步状态检测实现方法.代码如下: 代码如下: #!/bin/sh #check MySQL_Slave Status #crontab time 00:10 MYSQL_USER="ro

检测mysql同步状态实现代码(php/linux)

 代码如下 复制代码 #!/bin/sh   #check MySQL_Slave Status #crontab time 00:10 MYSQL_USER="root" MYSQL_PWD="123456" MYSQL_SLAVE_LOG="/tmp/check_mysql_slave.log" EMAIL="1351010****@139.com"   MYSQL_PORT=`netstat -na|grep "

cookie-java不用session,怎么保持登陆状态

问题描述 java不用session,怎么保持登陆状态 通过上网查询,很多人是这样一种思想,1,登陆 获取客户端传来的用户名密码,连接数据库验证,成功--把登陆信息保存在cookie中,设置cookie的时间2,写拦截器,在访问用户中心时,拦截下请求,看看是不是cookie是不是存在的,如果存在,取出用户信息,在做一次验证.如不在,则跳转到登陆页面. 这种思路每次访问都要去取cookie中的用户信息去校验,性能会收到影响吧 ,如果不进行校验的话,要是cookie被篡改,那样用户数据又正确 大神,

json-APICloud database 数据同步到sqlite数据库

问题描述 APICloud database 数据同步到sqlite数据库 sqlite数据库有一个日志表,存放的数据有更新的表名,数据的ID,以及需要更新这张表的字段(Json字符串,一张表可能有多个修改的字段),在C#程序里,需要更新的数据都存放在List<日志表>里面.但是list里面存放的有多个表的修改数据.怎么把每张表都能更新到(不要在每一张表都写一个更新语句).如果更新sql语句用","隔开,更新字段怎么控制(json该怎样去序列化呢)

Java并发框架——同步状态的管理

整个AQS框架核心功能都是围绕着其32位整型属性state进行,一般可以说它表示锁的数量,对同步状态的控制可以实现不同的同步工具,例如闭锁.信号量.栅栏等等.为了保证可见性此变量被声明为volatile,保证每次的原子更新都将及时反映到每条线程上.而对于同步状态的管理可以大体分为两块,一是独占模式的管理,另外是共享模式的管理.通过对这两种模式的灵活变换可以实现多种不同的同步器,如下图,对state的控制可以看成一个管道,管道的大小决定了同时通过的线程,独占模式好比宽度只容许一个线程通过的管道,在

spring整合hibernate-getHibernateTemplate().save()与session.save()有什么区别啊,哪个更好啊?

问题描述 getHibernateTemplate().save()与session.save()有什么区别啊,哪个更好啊? 如题:getHibernateTemplate().save()与getHibernateTemplate().getSessionFactory().getCurrentSession().save()有什么区别啊,哪个更好啊? 解决方案 getHibernateTemplate().save()方法是经过spring封装的,例如添加相应的声明式事务管 理,由sprin

mysql数据同步:不同数据库名,不同表名,字段名也不相同,怎么同步数据呢?

问题描述 mysql数据同步:不同数据库名,不同表名,字段名也不相同,怎么同步数据呢? 工作当中遇到了一个问题,本人刚入行菜鸟不知道怎么解决,想问问大虾: A服务器上有数据库db_a,库中有表tbl_a,表中有字段col_a, B服务器上有数据库db_b,库中有表tbl_b,表中有字段col_b, AB数据库名不同,表名不同,字段名也不同. 现在需要把A服务器上tbl_a表中col_a字段的数据 同步到 B服务器上tbl_b表中col_b字段. (也不知道我的描述各位看官能看懂不) 该怎么做呢?