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

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:Java对象持久化详解.zip

    本书的核心内容可能包括以下几个方面: 1. **Hibernate基础**:介绍Hibernate的基本概念、架构和安装配置,包括如何在项目中集成Hibernate,以及配置hibernate.cfg.xml文件。 2. **对象关系映射(ORM)**:详述...

    Hibernate_Session_Transaction

    `Session`具有以下几个关键特性: 1. **非线程安全**:由于`Session`不是线程安全的,因此在多线程环境中,每个线程都应有自己的`Session`实例,以避免数据存取的混乱。 2. **轻量级**:`Session`的创建和销毁相对...

    实现自己的Hibernate框架之Session 方法实现

    实现Session的方法涉及到以下几个关键步骤: 1. **连接管理**:需要维护数据库连接池,确保高效地获取和释放数据库连接。 2. **事务处理**:在Session方法中通常会包裹在一个事务中,以确保数据操作的一致性和完整...

    Hibernate学习之 : 一对多关联映射

    此注解包含几个关键属性,如`targetEntity`指定关联的实体类,`mappedBy`用于指定在子实体中的反向引用字段,`cascade`控制级联操作,以及`fetch`定义加载策略。 ```java @Entity public class User { @OneToMany...

    hibernate中session的管理

    在Hibernate框架中,Session是与数据库交互的主要接口,它负责对象的持久化操作。然而,由于Session不是线程安全的,所以在多线程环境中管理Session就需要特别注意。本篇文章将详细探讨Hibernate中Session的管理,...

    Hibernate Session释放模式

    在Java的持久化框架Hibernate中,Session对象是与数据库交互的核心组件,它负责管理对象的持久状态。在处理大量数据或者长时间运行的事务时,合理地管理Session的生命周期至关重要,这就涉及到了Hibernate的Session...

    hibernate session生命周期示例

    Session对象负责管理实体对象的状态,包括保存、更新、删除和检索数据。它的生命周期主要包括以下几个阶段: 1. **创建Session**: 当我们调用`SessionFactory.openSession()`方法时,一个新的Session实例就会被...

    Hibernate映射导致的几个异常

    避免这个问题的方法是在访问懒加载属性之前确保Session仍然打开,或者显式地在需要时加载属性,如使用`Hibernate.initialize()`方法。 ### 5. MappingException - **MappingException: Error reading resource**:...

    day36 04-Hibernate检索方式:多表连接查询

    在多表连接查询的场景下,Hibernate提供了几种不同的方法来处理数据关联,包括HQL(Hibernate Query Language)查询、Criteria API以及传统的JPA(Java Persistence API)注解。 1. **HQL查询**: Hibernate Query...

    Hibernate_11session

    比如,`save()`方法用于保存一个新的对象到数据库,`update()`用于更新已存在的对象,而`delete()`则是删除对象。 三、Session的事务管理 在Hibernate中,Session与数据库交互时通常是在事务中进行的。你可以使用...

    非常好的Hibernate学习资料

    书中可能涵盖以下几个关键知识点: 1. **对象关系映射(ORM)**:ORM是Hibernate的基础,它通过将Java对象映射到数据库表,实现了对象与数据的透明转换,使得开发人员无需关注底层SQL,更专注于业务逻辑。 2. **...

    hibernate-lib。rar

    “lib”文件夹中的jar包包含了Hibernate运行所必需的类库,主要包括以下几个关键组件: - hibernate-core.jar:这是Hibernate的核心库,包含了许多核心接口和实现,如Session、SessionFactory、Query等。 - antlr...

    对Hibernate Session做一个简单的包装

    在Java的持久化框架中,Hibernate是一个非常流行的ORM(对象关系映射)工具,它使得开发者可以更加方便地处理数据库操作。本篇文章将探讨如何对Hibernate的`Session`进行简单的包装,以提升代码的可维护性和灵活性。...

    Hibernate学习指南pdf

    Hibernate的核心API围绕着几个关键组件展开: - **Configuration**: 负责管理数据库连接信息,通过加载配置文件(如myhibernate.xml)来初始化框架。 - **映射文件**: 定义了Java对象与数据库表之间的映射规则,是...

    hibernate学习文档

    在 Hibernate 中,ORM 的实现主要包括以下几个方面: - **实体类**:表示数据库表中的一行数据,通常一个表对应一个实体类。 - **Session**:Hibernate 提供的用于操作数据库的基础接口,负责执行 CRUD 操作。 - **...

    hibernate错误解决方案

    本文将针对几个常见的Hibernate错误进行深入分析,并提供相应的解决方法。这些错误包括但不限于 `org.springframework.orm.ObjectRetrievalFailureException`、`org.springframework.beans.factory....

    Hibernate学习资料

    Hibernate的体系结构主要包括以下几个关键组件: - **SessionFactory**: 它是Hibernate框架中最重要的对象之一,负责构建Session对象。SessionFactory在整个应用中通常是单例模式。 - **Session**: Session对象是...

    Hibernate操作数据库的方法

    Hibernate操作数据库时,主要通过以下几个核心组件来实现持久层操作: 1. **Session**:Session是Hibernate用来和数据库进行交互的一个轻量级对象,它相当于JDBC中的Connection。Session对象是应用程序与数据库进行...

    hibernate全套学习课件ppt

    13. **实体生命周期**:Hibernate定义了几个关键的生命周期状态,如瞬时态、持久态、游离态和脱管态,理解这些状态有助于更好地管理对象。 本套课件详细讲解了上述知识点,并可能包含实际案例和练习,是学习...

Global site tag (gtag.js) - Google Analytics