Session的save()方法用来将一个临时对象转变为持久化对象,也就是将一个新的实体保存到数据库中。通过save()将持久化对象保存到数据库需要经过以下步骤:

1,系统根据指定的ID生成策略,为临时对象生成一个唯一的OID;

2,将临时对象加载到缓存中,使之变成持久化对象;

3,提交事务时,清理缓存,利用持久化对象包含的信息生成insert语句,将持久化对象保存到数据库。

OK,下面来看一个实例:

        //创建SessionFactory
Configuration config = new Configuration();
ServiceRegistry sr = new ServiceRegistryBuilder().applySettings(config.getProperties()).buildServiceRegistry();
SessionFactory sessionFactory = config.buildSessionFactory(sr); //打开Session
Session session = sessionFactory.openSession(); //开启事务
Transaction tx = session.beginTransaction(); //创建临时对象并赋值
User user = new User();
user.setId("1");
user.setUserName("lsj");
session.save(user); //提交事务
tx.commit(); //关闭Session
session.close();

PS:

1,从Hibernate 4之后,Configuration类中,原先常用的,获取SessionFactory的方法buildSessionFactory()被标记为过时,官方建议使用buildSessionFactory(ServiceRegistry sr)这个方法来获取SessionFactory。

2,如果映射文件中为对象的ID指定了生成策略,那么在程序中为其ID赋值是无效的。会被系统自动生成的值覆盖,例如:

映射文件指定ID生成策略由Hibernate控制自增:

        <id name="id" type="string">
<generator class="increment">
</id>

然后程序中进行如下操作:

        user.setId("1");
System.out.println("手动赋值为:"+user.getId());
session.save(user);
System.out.println("存入数据库的值为:"+user.getId());

这样,最终存入数据库的ID是Hibernate自动生成的自增ID,而不是我们手动给的值。

另外,执行save()方法时并不会将对象存入数据库,在提交事务时,对象才被真正的保存到数据库中。save()方法是将对象保存到Session的缓存中,提交事务时,Hibernate会生成相应的insert语句,将对象保存到数据库。

再跟大家说一点需要注意的地方,Hibernate在提交事务的时候,会将之前对对象做的操作一并提交。就算是在save()方法之后做的操作也一样。什么意思呢?我们看下面的例子:

        user.setUserName("old");
session.save(user);
user.setUserName("new");
tx.commit();

执行以上操作,最终user.getUserName();得到的值将会是“new”,而不会是“old”,因为Hibernate在提交事务的时候把对user对象的所有操作都提交了。

OK,今天就到这里,save()方法虽然看起来是一个很简单的方法,但是需要注意这些细小的地方,否则很容易出一些问题。一句话:学习框架的原理很重要,要想理解框架的原理,最直接的办法就是看源码。

每天学一点,每天进步一点。祝大家每天进步。

菜鸟学SSH(九)——Hibernate——Session之save()方法的更多相关文章

  1. 菜鸟学SSH(八)——Hibernate对象的三种状态

    前面写了几篇关于SSH的博客,但不是Struts就是Spring,Hibernate还从来没写过呢.说好是SSH的,怎么可以光写那两个,而不写Hibernate呢对吧.今天就先说说Hibernate对 ...

  2. 菜鸟学SSH(十五)——简单模拟Hibernate实现原理

    之前写了Spring的实现原理,今天我们接着聊聊Hibernate的实现原理,这篇文章只是简单的模拟一下Hibernate的原理,主要是模拟了一下Hibernate的Session类.好了,废话不多说 ...

  3. 菜鸟学SSH(十七)——基于注解的SSH将配置精简到极致

    很早之前就想写一篇关于SSH整合的博客了,但是一直觉得使用SSH的时候那么多的配置文件,严重破坏了我们代码整体性,比如你要看两个实体的关系还得对照*.hbm.xml文件,要屡清一个Action可能需要 ...

  4. 菜鸟学SSH(三)——Struts2国际化自动检测浏览器语言版

    前几天发了一篇Struts国际化的博客——<菜鸟学习SSH(二)——Struts2国际化手动切换版>,有网友提了一个意见,见下图: 于是就有了下面修改的版本: web.xml <?x ...

  5. Hibernate Session对象核心方法

    1. 持久化对象的状态: 站在持久化的角度,Hibernate 把对象分为四种状态:持久化状态,临时状态,游离状态,删除状态 Session 的特定方法能使对象从一个状态转到另一个状态 临时对象: 在 ...

  6. 菜鸟学SSH(十八)——Hibernate动态模型+JRebel实现动态创建表

    项目用的是SSH基础框架,当中有一些信息非常相似,但又不尽同样.假设每个建一个实体的话,那样实体会太多.假设分组抽象,然后继承,又不是特别有规律.鉴于这样的情况.就打算让用户自己配置要加入的字段,然后 ...

  7. 菜鸟学SSH(十)——Hibernate核心接口

    在使用Hibernate的时候,我们通常都会用的Configuration.SessionFactory.Session.Transaction.Query和Criteria等接口.通过这些接口可以, ...

  8. 菜鸟学SSH(十一)——Hibernate之SchemaExport+配置文件生成表结构

    今天说点基础的东西,说说怎样通过SchemaExport跟Hibernate的配置文件生成表结构.事实上方法很easy,仅仅须要两个配置文件,两个Java类就能够完毕. 首先要生成表,得先有实体类,以 ...

  9. 菜鸟学SSH(十二)——Hibernate与Spring配合生成表结构

    前几天向大家介绍了一种用工具类生成数据表的方法,只是之前的方法须要使用一个跟项目关系不大的工具类.不免让人认为有些多余,所以呢.今天再向大家介绍一种方法.即Hibernate与Spring配合生成表结 ...

随机推荐

  1. java第六节 字符串/集合

    /* *String类和StringBuffer类 * 位于java.lang包中 * String类对象中的内容一旦被初始化就不能再改变 * StringBuffer类中用于封装内容可以改变的字符串 ...

  2. JavaScript的NaN-唯一 一个自己不等于自己的对象!!

    JavaScript的NaN为什么不等于NaN 在JS中 Object === Object 感觉没有任何问题 这两个都代表的一个东西 但是如果你试过 NaN === NaN 是返回false为什么呢 ...

  3. Ubuntu16.04 释放/boot目录空间

    查看当前系统内核 $ uname -a Linux linuxidc --generic #-Ubuntu SMP Mon Feb :: UTC x86_64 x86_64 x86_64 GNU/Li ...

  4. 移动端强大的富文本编辑器richeditor-android

    代码地址如下:http://www.demodashi.com/demo/14883.html 一.运行效果图 二.代码具体实现 1.引入richeditor-android richeditor-a ...

  5. Netty-gRPC介绍和使用

    转自:http://www.saily.top/2017/07/23/netty5/ gRPC Define your service using Protocol Buffers, a powerf ...

  6. 修改cnblogs日历控件CSS

    自定义cnblogs日期控件的样式时, 关于透明度 控件头部死活没法透明 在background属性值后边添加!important即把cnblogs系统自带的属性覆盖, 解决了该问题. !import ...

  7. Eclipse Java注释模板设置简介,更改字体大小

    为类添加注释:此为我的模板设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后展开Comments ...

  8. 颜色传感器TCS230及颜色识别电路(转)

    摘要 TCS230是美国TAOS公司生产的一种可编程彩色光到频率的传感器.该传感器具有分辨率高.可编程的颜色选择与输出定标.单电源供电等特点:输出为数字量,可直接与微处理器连接.文中主要介绍TCS23 ...

  9. android image加载中等待动画

    在布局中添加一个ImageViw和一个EditText. <ImageView android:id="@+id/loading_imageView_info" androi ...

  10. jquery datetimepicker 配置参数

    jquery的datetimepicker时间控件除了样式有点不太美观,功能性还是相当强大的. 在正常情况下input的type应该设置为"text",可点击又可输入(mask,e ...