`
schy_hqh
  • 浏览: 558190 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Hibernate基于配置文件(四)evict()与merge()的使用

 
阅读更多

 

evict()与merge()都用于解决:

内存中存在2个id相同的对象,session发现对象不唯一而抛出异常。

 

package org.leadfar.hibernate.model;

import java.util.Date;

import junit.framework.TestCase;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class UserTest03 extends TestCase {
	
	
	public void testUser_01() throws Exception {
		//默认读取类路径根目录下的hibernate.cfg.xml配置文件
		Configuration cfg = new Configuration().configure();
		
		//创建SessionFactory
		SessionFactory sfactory = cfg.buildSessionFactory();
		
		//创建Hibernate Session
		Session session = sfactory.openSession();
		
		//创建实体对象
		User user = new User();//此时User对象处于Transient(瞬时)状态
		user.setName("张三");
		user.setAge(20);
		user.setSex(false);
		user.setBirthday(new Date());
		user.setMoney(99999.99);
		user.setId(109);
		
		try {
			//开启事务
			session.beginTransaction();
			
			User dbUser = (User)session.get(User.class, 109);
			Date oldbirthday = dbUser.getBirthday();
			
			//session.update(user):发生异常。
			//具有相同标识符的不同对象与同一个session相关联,引发异常NonUniqueObjectException
			//org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [org.leadfar.hibernate.model.User#109]
			
			session.update(user);//update离线对象---当前session绑定的对象是dbUser,但是更新的是user对象(内存中存在两个对象与数据库中同一条记录(id=109)相关联)
			
			user.setName("手机");
			user.setBirthday(oldbirthday);
			
			
			//提交事务
			session.getTransaction().commit();
			
		} catch(Exception e) {
			e.printStackTrace();
			//出现异常,回滚事务
			session.getTransaction().rollback();
		} finally {
			//关闭session
			session.close();//session关闭之后,user对象处于离线Detached状态
		}
	}
	
	public void testUser_02() throws Exception {
		//默认读取类路径根目录下的hibernate.cfg.xml配置文件
		Configuration cfg = new Configuration().configure();
		
		//创建SessionFactory
		SessionFactory sfactory = cfg.buildSessionFactory();
		
		//创建Hibernate Session
		Session session = sfactory.openSession();
		
		//创建实体对象
		User user = new User();//此时User对象处于Transient(瞬时)状态
		user.setName("张三");
		user.setAge(20);
		user.setSex(false);
		user.setMoney(99999.99);
		user.setId(109);
		
		try {
			//开启事务
			session.beginTransaction();
			
			User dbUser = (User)session.get(User.class, 109);
			Date oldbirthday = dbUser.getBirthday();//获取以前对象的birthday
			
			//切断与session的连接,释放session
			session.evict(dbUser);
			
			//update离线对象,与session进行关联
			session.update(user);
			
			user.setName("手机");
			user.setBirthday(oldbirthday);//设置以前对象的birthday到新的对象中(保证birthday不变)
			
			
			//提交事务
			session.getTransaction().commit();
			
		} catch(Exception e) {
			e.printStackTrace();
			//出现异常,回滚事务
			session.getTransaction().rollback();
		} finally {
			//关闭session
			session.close();//session关闭之后,user对象处于离线Detached状态
		}
	}
	
	//merge解决了两个对象关联一个session的问题
	public void testUser_merge() throws Exception {
		//默认读取类路径根目录下的hibernate.cfg.xml配置文件
		Configuration cfg = new Configuration().configure();
		
		//创建SessionFactory
		SessionFactory sfactory = cfg.buildSessionFactory();
		
		//创建Hibernate Session
		Session session = sfactory.openSession();
		
		//创建实体对象
		User user = new User();//此时User对象处于Transient(瞬时)状态
		user.setName("美女2号线");
		user.setAge(20);
		user.setSex(false);
		user.setMoney(88.99);
		user.setId(109);//带更新的记录主键为109
		
		try {
			//开启事务
			session.beginTransaction();
			
			//dbUser与session关联
			User dbUser = (User)session.get(User.class, 109);

			user.setBirthday(dbUser.getBirthday());//设置以前对象的birthday到新的对象中(保证birthday不变)
			
			//merge--不用evict(驱逐)其它对象释放session
			//相当于把user对象的值拷贝到dbUser持久化对象中
			//由于没有调用update方法,所以user对象是处于瞬时状态的!
			//session关联的对象是dbUser,而user对象只是一个瞬时状态的对象
			session.merge(user);

			//提交事务
			session.getTransaction().commit();
			
		} catch(Exception e) {
			e.printStackTrace();
			//出现异常,回滚事务
			session.getTransaction().rollback();
		} finally {
			//关闭session
			session.close();//session关闭之后,user对象处于离线Detached状态
		}
	}
}

 

分享到:
评论

相关推荐

    hibernate-3.2.rar

    2. **配置文件**:`hibernate.cfg.xml`是Hibernate的主配置文件,其中包含了数据库连接信息、事务管理策略、缓存配置等设置。在3.2版本中,开发者需要在这个文件中定义数据源、JDBC驱动等信息。 3. **实体类与映射...

    Hibernate3.1API.rar

    在使用Hibernate3.1 API时,首先需要配置hibernate.cfg.xml文件,其中包含了数据库连接信息、缓存设置、方言选择等关键参数。完成配置后,通过SessionFactory的createSessionFactory()方法初始化会话工厂,为后续...

    Struts+Hibernate+Spring面试题合集及答案常见题目经典精选汇总大全.docx

    - Hibernate是一个对象关系映射(ORM)框架,通过提供API和XML配置文件,使得Java对象可以直接与数据库进行交互。 - Hibernate工作原理主要包括读取配置文件和映射信息,创建SessionFactory,然后通过...

    hibernate帮助手册api大集合

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者将数据库操作与对象模型进行无缝集成。这个“Hibernate帮助手册API大集合”显然包含了关于Hibernate的各种API文档和参考资料,旨在提供全面的指南...

    三大框架之一Hibernate 介绍

    通过XML映射文件或注解,Hibernate可以自动将对象转换为数据库中的记录,反之亦然。 2. **Session工厂(SessionFactory)**:SessionFactory是Hibernate的主要入口点,它负责管理和配置数据库连接,以及生成Session...

    jsp Hibernate 函数简介.docx

    - `Configuration`是配置Hibernate的核心类,负责读取Hibernate配置文件(hbm.xml或hibernate.cfg.xml),并建立Java类与数据库表之间的映射关系。 - `SessionFactory`是线程安全的,通常在应用启动时创建,然后在...

    西安领航核心项目Hibernate部分重点、难点总结

    以下是对给定文件中提到的关键知识点的详细解读: ### 持久化对象的三种状态 1. **瞬时状态**:对象被new创建后,处于瞬时状态,此时它没有数据库ID,也不受Session管理。 2. **持久化状态**:当对象被Session加载...

    hibernate session.doc

    另外,`Session`还有一系列方法用于处理对象的状态转换,如`lock()`、`merge()`、`refresh()`、`evict()`等,这些方法在处理对象生命周期的不同阶段时非常关键。 `Configuration`和`SessionFactory`也是Hibernate的...

    jsp Hibernate 函数简介

    - **Configuration**:在Hibernate中,`Configuration` 类是配置Hibernate的基础,它负责加载配置文件(如 `hibernate.cfg.xml` 和实体映射文件等),并且通过它来创建 `SessionFactory` 实例。`Configuration` 是一...

    参考文档

    2. **配置文件**:包括hibernate.cfg.xml,用来配置数据库连接信息,以及实体类的映射文件(hbm.xml),定义对象与表的映射规则。 3. **Session和Transaction**: Hibernate的核心工作单元是Session,负责对象的持久...

Global site tag (gtag.js) - Google Analytics