`
zy19982004
  • 浏览: 652912 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
博客专栏
F6f66edc-1c1a-3859-b76b-a22e740b7aa7
Hadoop学习
浏览量:249386
社区版块
存档分类
最新评论

Hibernate学习三:Session对象的几个方法

 
阅读更多

一.前言

     上文Hibernate学习二:Hibernate对象状态及转换中描述了hibernate中对象的三种状态。自然的,对session中的许多方法,save(),update(),saveOrUpdate(),merge(),delete()方法,我都有了自己的想法:传什么状态的对象做为这些方法的参数,方法返回给我什么状态的对象。为了验证自己的想法,也为了方便别人,遂做此文。

 

 

二.你需要知道以下知识

     如果你不愿意参考上面一篇文章,没关系,记住下面三句话:

  1. 临时状态对象未和任何一个session相关联,在数据库里没有对应记录,对象没有数据库标识的OID。
  2. 持久化状态对象和session相关联,在数据库有对应记录,对象多了一个数据库标识的OID。
  3. 游离状态对象不和任何一个session ,但在数据库有对应记录,对象多了一个数据库标识的OID。

 

三.public Serializable save(Object object) throws HibernateException;

  1. object是临时状态对象:直接插入记录。返回此记录对应的持久化对象。
  2. object是持久化状态对象:根据id先select这条记录,判断是否有更改,有则update,无则不处理。返回此记录对应的持久化对象。
  3. object是游离状态对象(奇葩的方法,一般没人这么搞吧):根据id先select这条记录,无论是否有更改,插入一条新记录,原记录仍然存在。返回此新记录对应的持久化对象。
	public void test() {
		Session session = getSession(); 
		Transaction tr = session.beginTransaction();  
		
		//临时状态对象 执行以下sql
		//Hibernate: insert into test.user (name, password) values (?, ?)
//		User user = new User();
//		user.setName("sa");
//		user.setPassword("sa");
//		session.save(user);
		
		//持久化状态对象 执行以下sql
		//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
		//Hibernate: update test.user set name=?, password=? where id=?
//		User user = (User) session.load(User.class, 1);
//		user.setName("s6dd");       //如果user[1]对象以前的Name就是s6dd,不执行update语句
//		session.save(user);
		
		//游离状态对象 执行以下sql
		//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
		//Hibernate: insert into test.user (name, password) values (?, ?)
		Session session2 = getSession();
		User user = (User) session2.load(User.class, 1);//当通过get或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该 po状态就处于detached,
		session2.delete(user);
		session2.close();
		user.setName("sb");
		session.save(user);
		
		tr.commit();
		session.close();
	}

 

 

四.public void update(Object object) throws HibernateException;

  1. object是临时状态对象:直接执行update,但临时状态对象没有持久化OID,抛异常,org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1。
  2. object是持久化状态对象:根据id先select这条记录,判断是否有更改,有则update,无则不处理。
  3. object是游离状态对象:根据id先select这条记录,无论是否有更改,都执行update操作。 

 

	public void test() {
		Session session = getSession(); 
		Transaction tr = session.beginTransaction();  
		
		//临时状态对象 执行以下sql
		//Hibernate: update test.user set name=?, password=? where id=?
//		User user = new User();
//		user.setName("sa");
//		user.setPassword("sa");
//		session.update(user);
		
		//持久化状态对象 执行以下sql
		//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
		//Hibernate: update test.user set name=?, password=? where id=?
//		User user = (User) session.load(User.class, 1);
//		user.setName("sx122");       //如果user[1]对象以前的Name就是s6dd,不执行update语句
//		session.update(user);
		
		//游离状态对象 执行以下sql
		//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
		//Hibernate: update test.user set name=?, password=? where id=?
		Session session2 = getSession();
		User user = (User) session2.load(User.class, 19);//当通过get或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该 po状态就处于detached,
		session2.delete(user);
		session2.close();
		user.setName("2sb");
		session.update(user);
		
		tr.commit();
		session.close();
	}

 

五.public void saveOrUpdate(Object object) throws HibernateException;

  1. object是临时状态对象:直接执行save。此时saveOrUpdaue=save。
  2. object是持久化状态对象:根据id先select这条记录,判断是否有更改,有则update,无则不处理。此时saveOrUpdaue=save=update。
  3. object是游离状态对象:根据id先select这条记录,无论是否有更改,都执行update操作。此时saveOrUpdaue=update。
    	public void test() {
    		Session session = getSession(); 
    		Transaction tr = session.beginTransaction();  
    		
    		//临时状态对象 执行以下sql
    		//Hibernate: insert into test.user (name, password) values (?, ?)
    //		User user = new User();
    //		user.setName("sa");
    //		user.setPassword("sa");
    //		session.saveOrUpdate(user);
    		
    		//持久化状态对象 执行以下sql
    		//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
    		//Hibernate: update test.user set name=?, password=? where id=?
    //		User user = (User) session.load(User.class, 1);
    //		user.setName("s6dd");       //如果user[1]对象以前的Name就是s6dd,不执行update语句
    //		session.saveOrUpdate(user);
    		
    		//游离状态对象 执行以下sql
    		//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
    		//Hibernate: update test.user set name=?, password=? where id=?
    		Session session2 = getSession();
    		User user = (User) session2.load(User.class, 19);//当通过get或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该 po状态就处于detached,
    		session2.delete(user);
    		session2.close();
    //		user.setName("2sb");
    		session.saveOrUpdate(user);
    		
    		tr.commit();
    		session.close();
    	}
     

 

六. public Object merge(Object object) throws HibernateException;

  1. object是临时状态对象:同saveOrUpdate。
  2. object是持久化状态对象:同saveOrUpdate。
  3. object是游离状态对象:根据id先select这条记录,判断是否有更改,有则update,无则不处理。

 

	public void test() {
		Session session = getSession(); 
		Transaction tr = session.beginTransaction();  
		
		//临时状态对象 执行以下sql
		//Hibernate: insert into test.user (name, password) values (?, ?)
//		User user = new User();
//		user.setName("sa");
//		user.setPassword("sa");
//		session.merge(user);
		
		//持久化状态对象 执行以下sql
		//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
		//Hibernate: update test.user set name=?, password=? where id=?
//		User user = (User) session.load(User.class, 1);
//		user.setName("s6dd");       //如果user[1]对象以前的Name就是s6dd,不执行update语句
//		session.merge(user);
		
		//游离状态对象 执行以下sql
		//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
		//Hibernate: update test.user set name=?, password=? where id=?
		Session session2 = getSession();
		User user = (User) session2.load(User.class, 19);//当通过get或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该 po状态就处于detached,
		session2.delete(user);
		session2.close();
		user.setName("2sb");session.merge(user);
		tr.commit();
		session.close();
	}

 

 

七.public void delete(Object object) throws HibernateException;

  1. object是临时状态对象:居然不执行delete语句,难道是自动优化,session发现这个临时对象没有OID,忽略此次delete。
  2. object是持久化状态对象:直接delete记录,并清空session中对应缓存。
  3. object是游离状态对象:直接delete。
	public void test() {
		Session session = getSession(); 
		Transaction tr = session.beginTransaction();  
		
		//临时状态对象 不执行sql
//		User user = new User();
//		user.setName("sa");
//		user.setPassword("sa");
//		session.delete(user);
		
		//持久化状态对象 执行以下sql
		//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
		//Hibernate: delete from test.user where id=?
//		User user = (User) session.load(User.class, 19);
//		session.delete(user);
		
		//游离状态对象 执行以下sql
		//Hibernate: select user0_.id as id1_0_, user0_.name as name1_0_, user0_.password as password1_0_ from test.user user0_ where user0_.id=?
		//Hibernate: delete from test.user where id=?
		Session session2 = getSession();
		User user = (User) session2.load(User.class, 20);//当通过get或load方法得到的po对象它们都处于persistent,但如果执行delete(po)时(但不能执行事务),该 po状态就处于detached,
		session2.delete(user);
		session2.close();
		session.delete(user);
		
		tr.commit();
		session.close();
	}

 

七.saveOrUpdate()和merge()

  1. saveOrUpdate后的对象会纳入session的管理,对象的状态会跟数据库同步,再次查询该对
    象会直接从session缓存中取。
  2. merge后的对象不会纳入session的管理,再次查询该对象还是会从数据库中取。
分享到:
评论

相关推荐

    精通hibernate:对象持久化技术孙卫琴第二版part2

    处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 Java对象在JVM中的 生命周期 179 8.2 理解Session的缓存 181 8.2.1 Session的缓存的作用 182 ...

    精通Hibernate:对象持久化技术第二版part3

    处于持久化状态的Java对象位于一个Session实例的缓存中,Session能根据这个对象的属性变化来同步更新数据库。 8.1 Java对象在JVM中的 生命周期 179 8.2 理解Session的缓存 181 8.2.1 Session的缓存的作用 182 ...

    hibernate基础教程

    Hibernate的第二级缓存是一个插件,下面是几种常用的缓存插件: EhCache SwarmCache JBossCache等. 其中,EhCache是Hibernate的默认的插件. 四 EhCache的使用 第一步:修改Hibernate配置文件,启用...

    Hibernate Web应用的开发步骤

    Hibernate Web应用的开发一般经过以下几个步骤: (1)创建数据库。 (2)将Hibernate所需的JAR包复制到WEB-INF/lib下。 (3)创建Hibernate的配置文件。 (4)利用Hibernate的第三方工具或Eclipse的有关插件从...

    hibernate 3中的缓存小结

    当应用程序调用Session的save()、update()、savaeOrUpdate()、get()或load(),以及调用查询接口的list()、iterate()或filter()方法时,如果在Session缓存中还不存在相应的对象,Hibernate就会把该对象加入到第一级...

    Hibernate使用中防止SQL注入的几种方案

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。  在获取便利操作的同时,SQL的注入问题也值得我们的密切注意,...

    java面试题

    wait()是Object类的方法,对此对象调用了wait方法导致本线程放弃对象锁,进入等待锁定池,只有针对此对象发出notify方法后本线程才进入对象锁定池准备获得对象锁进入运行状态。 同步和异步,在什么情况下分别使用? ...

    Java语言基础下载

    DOM以及广义的基于树的处理具有几个优点 399 文档对象模型(DOM)解析实例 402 DOM对象 404 DOM解析的例子: 406 SAX解析实例 409 DOM4J解析实例 412 JDOM解析实例 413 JAVA操纵XML 实例讲解 414 通过JAVA写数据到...

    ssh(structs,spring,hibernate)框架中的上传下载

    Spring针对几个著名的Web服务器的数据源提供了相应的JDBC抽取器:  •WebLogic:WebLogicNativeJdbcExtractor  •WebSphere:WebSphereNativeJdbcExtractor  •JBoss:JBossNativeJdbcExtractor  在定义了JDBC...

    java面试宝典

    151、在servlets和JSP之间能共享session对象吗? 37 152、如何设置cookie在某一时间后过期? 37 153、如何获得当前的sessions数? 37 154、能设置一些代码在我所有的JSP文件之上运行?如果可以,能共享吗? 37 155、...

    千方百计笔试题大全

    151、在servlets和JSP之间能共享session对象吗? 37 152、如何设置cookie在某一时间后过期? 37 153、如何获得当前的sessions数? 37 154、能设置一些代码在我所有的JSP文件之上运行?如果可以,能共享吗? 37 155、...

    Web开发+java+ssh框架

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...

    计算机网络专业毕业实习报告3000字.docx

     Hibernate的核心接口一共有5个,分别为:Session、SessionFactory、Transaction、Query和Configuration。这5个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。 ...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    因此,在具体设计实现该博客网站时,主要考虑了主流博客网站的几个主要功能:(1)博客的注册、登录验证功能(2) 网络用户通过关键字搜索博文功能(3) 最热门博客页面推荐浏览(4) 文章详细内容及相关评论显示(5) 博客...

    整理后java开发全套达内学习笔记(含练习)

    以“%”开头,[第几个数值$][flags][宽度][.精确度][格式] printf()的引入是为了照顾c语言程序员的感情需要 格式化输出 Formatter;格式化输入 Scanner;正则表达式 输出格式控制: 转义符: \ddd 1到3位8...

    Java面试宝典2010版

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 17.介绍一下Hibernate的二级缓存 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message 属性, ...

    最新Java面试宝典pdf版

    16. hibernate进行多表查询每个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决; 123 17.介绍一下Hibernate的二级缓存 123 18、Spring 的依赖注入是什么意思? 给一个 Bean 的 message ...

    JAVA上百实例源码以及开源项目源代码

    在有状态SessionBean中,用累加器,以对话状态存储起来,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用完毕,从内存中清除…… Java Socket 聊天...

Global site tag (gtag.js) - Google Analytics