Hibernate入门基础(三)

关键类

在写好两个xml文件后,我们的代码通常会以如下形式来进行编写

//配置对象
Configuration cfg=new Configuration().configure();
//事物对象
Transaction tx=null;
//持久化对象
CUserInfo ci=null;
//session工厂
SessionFactory sessionFactory=null;
//session对象
Session databaseSession=null;

try{
	sessionFactory=cfg.buildSessionFactory();
	databaseSession=sessionFactory.openSession();
	tx=databaseSession.beginTransaction();
	ci=(CUserInfo)databaseSession.get(CUserInfo.class, 1000L);
	//提交事物
	tx.commit();
}catch(Exception e){
	/**
	*报错处理
	*/
}

在这来逐一的解释一下configuration、SessionFactory、Transaction以及session类。
configuration
此类是hibernate的一个入口类,在实例化此类的时候会在环境变量中去查找Hibernate的配置文件hibernate.properties。如果该文件存在,则将该文件的内容加载到一个Properties的实例GLOBAL_PROPERTIES里面,如果不存在,就打印信息hibernate.properties not found,在调用configure()方法后会自动在环境变量(classpath)下面寻找Hibernate配置文件hibernate.cfg.xml,如果该文件不存在,系统会抛出HibernateException异常: hibernate.cfg.xml not found;
总的来讲就是此类负责家在hibernate的配置文件
SessionFactory
此类是之后用于创建session的工厂类(从名字就能看出),此类是线程安全的,整个项目所有的session都由他来管,SessionFactory保存了对应当前数据库配置的所有映射关系,但是sessionFactory的创建比较复杂也比较消耗资源,所以通常情况下,在一个项目中我们只需要一个sessionfactory对象,这可以使用一个静态代码快来实现,也可以使用单例模式来实现,之后会进行代码实现此类对象在进行完一系列操作后有一个close方法来进行关闭,但是要注意的是因为整个项目调用的是同一个sessionfactory对象,所以如果在一个java web项目中关闭他,会导致其他用户访问页面时无法在使用这个sessionfactory对象,所以在web项目中一般不需要关闭他。
Transaction
事务类,在hibernate中所有的数据库操作都是封装在事务中的,所以如果只使用之后的session来保存数据,而不进行事务提交的话,数据是不会真正保存进数据库里的,的人hibernate也支持自动事物提交,但不提倡这么做,此类常用的两个方法

  • commit()方法,用于提交事务
  • rollback()方法,用于回滚
    其中第一个很好理解用于提交事务,在说第二个之前,先要说说事务的四个特性:
  1. 原子性
  2. 一致性
  3. 隔离性
  4. 持久性
    原子性:一个事务只有两种状态,要么失败,要么成功,不存在做到一半失败而导致出错的情况,所以为了应对这种情况出现了rollback()方法,此方法用于在代码出现异常时进行调用撤销之前的操作,使数据内容回到操作前的状态
    一致性:事务在进行操作时数据库里的数据必然会从一种变成另一种,这种情况称之为一致,假如在处理过程中,代码产生异常导致数据一部分写入而一部分未写入,则称其为非一致
    隔离性:事务并非只有一个,可能会有多个事务,这些事务之间不可相互干扰,为了防止这些事务之间出现干扰的情况,应该将事务进行隔离
    持久性:事物提交操作完毕后,数据应被永久存储下来,之后出现的异常不会对之前存储的数据产生影响
    现在就能明白了,rollback方法使用来保证原子性与一致性的

Session
要注意的是这里的session与HttpSession并非同一个,他也可以被理解为是一个会话,他用来对数据库进行常见的增删查改操作,使用时要记得对事务进行提交,只对此类进行操作无法完成数据的持久化,常用方法:

  • save(Object arg0):用来保存数据
  • delete(Object arg0):用来删除数据,根据主键
  • close():关闭会话,意味着当前会话结束
  • flush():强制将内存中的数据同步到数据库
  • clear():将当前缓存区内的数据清空

刚刚在上面提到sessionfactory的创建比较耗费资源,所以一下代码将演示如何对sessionfactory进行初始化,再加上如何对指定数据进行删除
首先,要创建一个工厂类,在此类中编写一个返回isessionfactory对象的方法,在这我先使用静态代码块来实现:

public class DynamicFactory {
	private static SessionFactory sFactory=null;
	private static Configuration cfgConfiguration=null;

	static{
			cfgConfiguration=new Configuration();
			cfgConfiguration.configure();
			sFactory=cfgConfiguration.buildSessionFactory();
	}
		public static synchronized SessionFactory getSessionFactory(){
		return sFactory;
	}
}

然后还可以用懒汉单例模式来实现:

public class DynamicFactory {
	private static SessionFactory sFactory=null;
	private static Configuration cfgConfiguration=null;
	
	public DynamicFactory() {
		// TODO Auto-generated constructor stub
	}
	/**
	 * 
	 * @return
	 * 单例模式创建SessionFactory
	 * 
	 */
	public static synchronized SessionFactory getSessionFactory () {
		if(sFactory==null) {
			cfgConfiguration=new Configuration();
			cfgConfiguration.configure();
			sFactory=cfgConfiguration.buildSessionFactory();
		}
		return sFactory;
	}
}

然后再在获取sessionfactory时只需要:

	SessionFactory sFactory=null;
	try {
			//获取sessionfaction
			sFactory=DynamicFactory.getSessionFactory();
			soSession=sFactory.openSession();
			txTransaction=soSession.beginTransaction();
			sqlRunBean=new sqlclass();
		} catch (Exception e) {
			/**
			*异常处理
			*/
		}

下面再来简单介绍一下如何删除一条数据记录,可以直接使用delete方法,此方法与save()方法用法一样,他根据主键来删除数据:

	//sqlclass为我自定义的与表关联的类,id为主键
	sqlclass idvalue=new sqlclass()
	idvale.setId(1L);
	.......
	try {
			sqlRunBean.setId(idvalue);
			soSession.delete(sqlRunBean);
			//正常则提交
			txTransaction.commit();
		}catch (Exception e) {
			// TODO: handle exception
			//异常则进行回滚
			txTransaction.rollback();
			//异常处理
		}

猜你喜欢

转载自blog.csdn.net/weixin_43815930/article/details/106247142