Hibernate Session中的save(),update(),delete(),saveOrUpdate() 细粒度分析
Hibernate在对资料库进行操作之前,必须先取得Session实例,相当于JDBC在对资料库操作之前,必须先取得Connection实例, Session是Hibernate操作的基础,它不是设计为执行绪安全(Thread-safe),一个Session由一个执行绪来使用。
- 开启Session
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();
tx.commit();
session.close();
如果未能发现相符合的资料,则get()方法会返回null,而load()方法会丢出ObjectNotFoundException,在进阶的应用中,load()方法可以返回代理(proxy)物件,在必要时才真正查询资料库取得对应资料,并可充分利用快取机制。
在Hibernate 3中,取消了find()方法,您必须透过Query或Criteria来进行资料查询。
- 删除资料
Transaction tx = session.beginTransaction();
User user = (User) session.get(User.class, new Integer(1));
session.delete(user);
tx.commit();
session.close();
- 更新资料
如果您开启了一个Session,从资料表中取出资料显示到使用者介面上,之后关闭Session,当使用者在介面上操作完毕并按下储存时,这时您要重新开启一个Session,使用update()方法将物件中的资料更新至对应的资料表中:
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();
<generator class="native"/>
</id>
unsaved-value可以设定的值包括:
- any:总是储存
- none:总是更新
- null:id为null时储存(预设)
- valid:id为null或是指定值时储存
这样设定之后,您可以使用Session的saveOrUpdate()方法来取代update()方法。
- 合并状态
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();
context已载入一笔资料,并有同一个id的User 实例了,同一个Persistence
context不会有两个相同id的物件实例,因此丢出NonUniqueObjectException。
就这边的例子来说,您应该使用merge()而不是update():
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();
Hibernate Session中的save(),update(),delete(),saveOrUpdate() 细粒度分析的更多相关文章
- Hibernate session中的createCriteria方法
在应用中获取session对象: Session session= HibernateUtil.getSession(); List list=session.createCriteria(Mete ...
- SQL Server 2008中SQL增强之三:Merge(在一条语句中使用Insert,Update,Delete) 一条语句实现两表同步(添加、删除、修改)
MERGE 目标表 USING 源表 ON 匹配条件 WHEN MATCHED THEN 语句 WHEN NOT MATCHED THEN 语句; http://www.chinaz.com/prog ...
- Hibernate: save, persist, update, merge, saveOrUpdate[z]
[z]https://www.baeldung.com/hibernate-save-persist-update-merge-saveorupdate 1. Introduction In this ...
- [转]Hibernate Session各种状态转换方法分析
摘自http://spiritfrog.iteye.com/blog/221177 我的印象里, Hibernate session中常用的保存操作只有:save, update, saveOrUpd ...
- org.hibernate.Session常用方法的作用总结
clear(): 清理session缓存.把所有加载出来的持久化实例都从session缓存中清除,同时,也会挂掉当前session中正在排队的save,update,delete操作. evict: ...
- Hibernate Session & Transaction详解
Hibernate Session & Transaction详解 HIbernate中的Session Session是JAVA应用程序和Hibernate进行交互时使用的主要接口,它也是持 ...
- Hibernate中对象的三种状态即save(),update(),saveOrUpdate()的使用【转】
当new一个user的时候,是处于瞬时状态 当调用session.save(user)的时候,user对象会放到session里,此时处于持久状态 当提交事务的时候,user对象才会存到DB中 当调用 ...
- hibernate save,update,saveorupdate方法有什么区别
save肯定是添加的时候用,update修改时候用,saveorupdate是添加或修改,如果真是这样save和update的存在就没意义了,我们直接saveorupdate就行了. save在添加用 ...
- Hibernate三种状态的区分,以及save,update,saveOrUpdate,merge等的使用 引自http://www.blogjava.net/TiGERTiAN/archive/2008/10/25/236519.html
Hibernate的对象有3种状态,分别为:瞬时态(Transient). 持久态(Persistent).脱管态(Detached).处于持久态的对象也称为PO(Persistence Object ...
随机推荐
- sublime text3 常用插件安装
1.Package Control 按Ctrl+~调出console(或者view>show console) 粘贴以下代码到底部命令行并回车: import urllib.request,os ...
- win7系统下的飞秋发送文件失败问题
飞秋发送文件失败这个问题大多数是由防火墙引起的1.检查windows自带的防火墙设置,在左侧的"允许程序通过windows防火墙"查看飞秋是否存在,不存在则增加之,公网.专网都勾选 ...
- component
在xml配置了这个标签后,spring可以自动去扫描base-pack下面或者子包下面的Java文件,如果扫描到有@Component @Controller@Service等这些注解的类,则把这些类 ...
- Python: open和codecs.open
python的编解码: input文件(gbk, utf-8...) ----decode-----> unicode -------encode------> output文件 ...
- MAC OS PHP
Apache与PHP的配置 OSX自带了apache和php,但默认情况下没有开启,打开终端 sudo apachectl start 这时在浏览器中输入localhost应该就会出现apache标准 ...
- 在ashx文件中制作验证码(使用session要继承IRequiresSessionState)
必须继承System.Web.SessionState.IRequiresSessionState接口,才能实现Session读写! System.Web.SessionState的一些接口 IRea ...
- 限制textarea的字数(包括复制粘贴)
<textarea cols="100%" rows="10" id="tuconent" placeholder="评价( ...
- 三、线程同步之Sysnchronized关键字
线程同步 问题引入 观察一面一段小程序: public class Main { private static int amount = 0; public static void main(Stri ...
- 使用AFNetWorking上传图片
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager]; NSString *string ...
- 数据库邮件服务器中sp_send_dbmail的参数使用
sp_send_dbmail [ [ @profile_name = ] 'profile_name' ] [ , [ @recipients = ] 'recipients [ ; n ]' ...