Hibernate在对资料库进行操作之前,必须先取得Session实例,相当于JDBC在对资料库操作之前,必须先取得Connection实例, Session是Hibernate操作的基础,它不是设计为执行绪安全(Thread-safe),一个Session由一个执行绪来使用。

  • 开启Session
Session实例由SessionFactory开启获得,例如:
Configuration config = new Configuration().configure();

SessionFactory sessionFactory = config.buildSessionFactory();

Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

....

tx.commit();

session.close();


开启Session不会马上取得Connection,而是在最后真正需要连接资料库进行更新或查询时才会取得Connection,如果有设定User user = new User();

user.setName("momor");

user.setAge(new Integer(26));



Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

session.save(user);

tx.commit();

session.close();


Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();
User user = (User) session.get(User.class, new Integer(1));

tx.commit();

session.close();


如果未能发现相符合的资料,则get()方法会返回null,而load()方法会丢出ObjectNotFoundException,在进阶的应用中,load()方法可以返回代理(proxy)物件,在必要时才真正查询资料库取得对应资料,并可充分利用快取机制。



在Hibernate 3中,取消了find()方法,您必须透过Query或Criteria来进行资料查询。
  • 删除资料
接下来看看使用Session删除资料,可使用delete()删除资料:

Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

User user = (User) session.get(User.class, new Integer(1));

session.delete(user);

tx.commit();

session.close();
 
  • 更新资料
当您在同一个Session中取出资料并封装为Persistence Object,接着更新物件状态,而后将Transaction commit,则物件上的状态更新将反应至资料库中,您无需额外进行任何的更新操作。



如果您开启了一个Session,从资料表中取出资料显示到使用者介面上,之后关闭Session,当使用者在介面上操作完毕并按下储存时,这时您要重新开启一个Session,使用update()方法将物件中的资料更新至对应的资料表中:
Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

User user = (User) session.get(User.class, new Integer(2));

tx.commit();

session.close();

....

user.setAge(new Integer(27));

session = sessionFactory.openSession();   

tx= session.beginTransaction();

session.update(user);

tx.commit();

session.close();
Session提供了一个saveOrUpdate()方法,为资料的储存或更新提供了一个统一的操作介面,藉由定义映射文件时,设定< id>标签的unsaved-value来决定什么是新的值必需,什么是已有的值必须更新:
<id name="id" column="id" type="java.lang.Integer" unsaved-value="null">

    <generator class="native"/>

</id>



unsaved-value可以设定的值包括:
  • any:总是储存
  • none:总是更新
  • null:id为null时储存(预设)
  • valid:id为null或是指定值时储存


这样设定之后,您可以使用Session的saveOrUpdate()方法来取代update()方法。
  • 合并状态
以这边的例子来说:

Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

User user1 = (User) session.get(User.class, new Integer(2));

tx.commit();

session.close();

....

user1.setAge(new Integer(27));



session = sessionFactory.openSession();   

tx= session.beginTransaction();

User user2 =(User) session.get(User.class, new
Integer(2)); // 同一个id

// user1 == user2 为 false

session.update(user1); // 丢出NonUniqueObjectException

tx.commit();

session.close();
在进行update()之前,您就先从资料库中取得另一笔资料,之后再尝试更新user1,由于目前的Persistence
context已载入一笔资料,并有同一个id的User 实例了,同一个Persistence
context不会有两个相同id的物件实例,因此丢出NonUniqueObjectException。



就这边的例子来说,您应该使用merge()而不是update():

Session session = sessionFactory.openSession();

Transaction tx = session.beginTransaction();

User user1 = (User) session.get(User.class, new Integer(2));

tx.commit();

session.close();

....

user1.setAge(new Integer(27));



session = sessionFactory.openSession();   

tx= session.beginTransaction();

User user2 =(User) session.get(User.class, new Integer(2)); // 同一个id

User user3 = (User) session.merge(user1);

// user1 == user2 为 false

// user2 == user3 为 true

tx.commit();

session.close();
merge()会将user1与user2的状态合并,传回的物件实例就是user2原先所参考的实例。

Hibernate Session中的save(),update(),delete(),saveOrUpdate() 细粒度分析的更多相关文章

  1. Hibernate session中的createCriteria方法

    在应用中获取session对象: Session session=  HibernateUtil.getSession(); List list=session.createCriteria(Mete ...

  2. SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete) 一条语句实现两表同步(添加、删除、修改)

    MERGE 目标表 USING 源表 ON 匹配条件 WHEN MATCHED THEN 语句 WHEN NOT MATCHED THEN 语句; http://www.chinaz.com/prog ...

  3. Hibernate: save, persist, update, merge, saveOrUpdate[z]

    [z]https://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate 1. Introduction In this ...

  4. [转]Hibernate Session各种状态转换方法分析

    摘自http://spiritfrog.iteye.com/blog/221177 我的印象里, Hibernate session中常用的保存操作只有:save, update, saveOrUpd ...

  5. org.hibernate.Session常用方法的作用总结

    clear(): 清理session缓存.把所有加载出来的持久化实例都从session缓存中清除,同时,也会挂掉当前session中正在排队的save,update,delete操作. evict: ...

  6. Hibernate Session & Transaction详解

    Hibernate Session & Transaction详解 HIbernate中的Session Session是JAVA应用程序和Hibernate进行交互时使用的主要接口,它也是持 ...

  7. Hibernate中对象的三种状态即save(),update(),saveOrUpdate()的使用【转】

    当new一个user的时候,是处于瞬时状态 当调用session.save(user)的时候,user对象会放到session里,此时处于持久状态 当提交事务的时候,user对象才会存到DB中 当调用 ...

  8. hibernate save,update,saveorupdate方法有什么区别

    save肯定是添加的时候用,update修改时候用,saveorupdate是添加或修改,如果真是这样save和update的存在就没意义了,我们直接saveorupdate就行了. save在添加用 ...

  9. Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用 引自http://www.blogjava.net/TiGERTiAN/archive/2008/10/25/236519.html

    Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Object ...

随机推荐

  1. Android Studio插件:PlantUML

    标记语言式的UML图编写工具,插件全名:PlantUML integration. 注意这个还要安装另一个软件:http://www.graphviz.org 并在PlantUML的设置中指定其路径. ...

  2. 解决JSP页面获取的数据库数据乱码问题

    将java项目部署到服务器,页面数据乱码: 解决:首先查看了数据库编码和jsp编码都是utf-8,说明jsp和数据库没问题,于是查看了tomcat设置的编码 没有设置编码,于是加了URIEncodin ...

  3. C语言 活动安排问题

    有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动? #include <stdio.h> #include <stdlib ...

  4. Content-disposition

    今天查看Struts2的文件上传部分 发现有个例子开头打印的信息中有Content-Disposition,一时好奇,所以了解了一下.顺便学习一下文件上传所需要的注意事项. Content-dispo ...

  5. Linux学习记录

    ---恢复内容开始--- linux与unix的关系 linux是借鉴了unix设计思想,也称linux位类unix系统. Linux常用命令 1.命令基本格式 命令[选项][参数] 注意:个别命令不 ...

  6. MongoDB学习笔记

    MongoDB的学习目标(v.3.4.0) 1.MongoDB的概念,非关系型数据库NOSQL 2.学会MongoDB的搭建 3.熟悉MongoDB使用 最基本的文档的读写更新删除 各种不同类型的索引 ...

  7. XP机器上WCF采用X509证书加密时IIS读取证书的授权

    XP机器上WCF采用X509证书加密时IIS读取证书的授权 XP下的授权命令为:winhttpcertcfg -g -c LOCAL_MACHINE\My -s 证书名称 -a "ASPNE ...

  8. wpf listview

    <Window x:Class="WpfTutorialSamples.ListView_control.ListViewGridViewSample"        xml ...

  9. Java_File类讲解_打印目录树状结构_递归算法

    package cn.xiaocangtian.testFile; import java.io.File; public class FileTree { public static void ma ...

  10. 手把手教你玩转nginx负载均衡(一)----使用vitualBox创建虚拟机

    引言 作为一个web程序员,有时候需要想尽办法来利用有限的资源来产生最大程度的负载,除了提高硬件配置,增加带宽之外,CDN加速,DNS加速,缓存,还可以利用反向代理.但是要说反向代理,就不的不说ngi ...