首页 > 数据库 > 其他综合 > 正文
【java】——Hibernate持久化对象的三个状态
2016-09-17       个评论      
收藏    我要投稿

【背景介绍】

这些天看了Hibernate的持久化对象的三个状态,突然想到了它与我学生时代的生活很相似:

1、当我还是一个学生的时候也就是具体的对象

2、学校的教室相当于数据库,其中的座位相当于表结构

3、教室中的上课老师就相当于Session

当我到学校的时候,我处于瞬时状态,此时我被学校引用;

当我得知自己要上某一个老师的课的时候,到了那个时间点我就处于持久化状态(这时老师可以将我安置到教室的某个座位上去);

当我正在上课的时候这时老师出去去厕所了(session关闭),这个时候我的心飞向了外面的远方,这时我就处于离线状态。

【概念分析】

瞬时对象(Transisent Objects):使用new操作符初始化的对象不是立刻就持久的,它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收。

持久化对象(Persist Objects):持久实例是任何具有数据库标识的实例,它有持久化管理器Session统一管理(这里不是内存中的session),持久实例是在事务中进行操作的——它们的状态在事务结束时同数据库进行同步,当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中

离线对象(Detached Objects):Session关闭之后,持久化对象就变为离线对象,离线表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。

根据背景介绍的例子,再结合概念分析,然后对比下面这幅图,进行深刻思考O(∩_∩)O~

\

【代码示例】

一、整体项目以及其中的类、配置文件结构图
\

二、测试持久化对象的三个状态的测试类(SessionTest.java)

 

-
package com.bjpowernode.hibernate;

import java.util.Date;

import org.hibernate.Session;
import org.hibernate.Transaction;

import junit.framework.TestCase;

/**
 * SessionTest类
 * @author mk
 *
 */
public class SessionTest extends TestCase {
	
	public void testSave3(){
		Session session = null;
		Transaction tx = null;
		User user = null;
		try {
			session = HibernateUtils.getSession();
			tx = session.beginTransaction();
			
			//Transaction状态
			//(此时我就是这里实例化出来的user,我需要找到被引用的学校)
			user = new User();
			user.setName("张三");
			user.setPassword("123");
			user.setCreateTime(new Date());
			user.setExpireTime(new Date());
			
			//Persistent状态
			//persistent状态对象,当对象的属性发生改变的时候
			//hibernate清理缓存(脏数据检查)的时候,会和数据库同步
			//下面语句就是老师将我安置到对应的座位上的过程
			session.save(user);
			user.setName("李四");
			//可以显示的调用update,此时为持久状态,调用update的方法没什么意义!
			session.update(user);
			tx.commit();
			
		} catch (Exception e) {
			e.printStackTrace();
			if (tx != null) {
				tx.rollback();
			}
		}finally{
			HibernateUtils.closeSession(session);
		}
		//detached状态
		//老师去厕所了,我的心到了外面,我成为了游离状态
		user.setName("王五");
		try {
			session = HibernateUtils.getSession();
			session.beginTransaction();
			//将detached状态的对象重新纳入session管理(这个时候是老师回来了,把我的心叫了回来)
			//此时将变为persistent状态的对象
			//persistent状态的对象,在清理缓存时会和数据库同步
			session.update(user);
			session.getTransaction().commit();
			
		} catch (Exception e) {
			e.printStackTrace();
			session.getTransaction().rollback();
		}finally{
			HibernateUtils.closeSession(session);
		}
	}
	
}
-

 

三、工具类(HibernateUtils.java)

 

-
package com.bjpowernode.hibernate;

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

public class HibernateUtils {
	
	//定义私有变量sessionFactory
	private static SessionFactory factory;
	
	//设定静态初始化
	static{
		try {
			//默认读取hibernate.cfg.xml文件
			Configuration cfg = new Configuration().configure();
			
			factory = cfg.buildSessionFactory();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	//返回打开的session
	public static Session getSession(){
		return factory.openSession();
	}
	
	//设定关闭session方法
	public static void closeSession(Session session){
		if (session != null) {
			if (session.isOpen()) {
				session.close();
			}
		}
	}
	
	//设定返回sessionfactory的方法
	public static SessionFactory getSessionFactory(){
		return factory;
	}
}
-

 

四、用户列表对应的类(User.java)

 

-
package com.bjpowernode.hibernate;

import java.util.Date;

/**
 * 用户表对应的类
 * @author mk
 *
 */
public class User {
	
	private String id;
	
	private String name;
	
	private String password;
	
	private Date createTime;
	
	private Date expireTime;

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public Date getCreateTime() {
		return createTime;
	}

	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}

	public Date getExpireTime() {
		return expireTime;
	}

	public void setExpireTime(Date expireTime) {
		this.expireTime = expireTime;
	}
}
-

 

五、用户列表对应的配置文件(User.hbm.xml)

 

-


	

	
	
		
		
			
		
		
		
		
		
	

-

 

六、数据库连接以及配置用户列表配置文件链接的文件(Hibernate.cfg.xml)

 

-



	
		
		com.mysql.jdbc.Driver
		jdbc:mysql://localhost:3306/hibernate_session
		root
		123456
		org.hibernate.dialect.MckoiDialect
		true
		
		
		
	

-

 

【总结】

只恨时光太匆匆,我永远回不到持久化状态了,我也很清楚那个时光对于每个人来说都非常重要,因为它是积攒力量的阶段,它将会是你将来在社会中奋起的力量。

在学习知识的同时也让我回忆了一下学生时代的美丽时光,也许这也就是做为一个程序猿美好的乐趣所在吧O(∩_∩)O~

用一颗朴实的心面对每一天每一件事,同时迎接下一个美好的到来O(∩_∩)O~

点击复制链接 与好友分享!回本站首页
上一篇:数据库连接
下一篇:Redis安装前的Linux环境准备
相关文章
图文推荐
文章
推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训
版权所有: 红黑联盟--致力于做实用的IT技术学习网站