首页 > 代码库 > Hibernate 接口

Hibernate 接口

HIbernate主要包含如下几个接口:Session,Query,Criteria以及Transaction。这些接口的实现在幕后是紧密相连的。

在一个HIbernate应用程序中,通过实质上改变他们的状态来保存和加载对象,我们在工作单元中进行这项工作。单个工作单元是一组被认为是原子团的操作。

1、开始工作单元

		Session session1 = factory.openSession();
		Transaction tx1 = session1.beginTransaction();

 一个新的持久化上下文被初始化了并同时开始了一个事务,它将管理这个session中所有的对象。如果需要访问多个数据库就会有多个sessionfactory对象

   sessionfactory对象的创建十分昂贵,所以不应该针对同一个数据库连接重复创建sessionfactory对象。

2、持久化对象

		Message item = new Message();
		Serializable itemId = session1.save(item);
		tx1.commit();
		session1.close();

  调用save()使得瞬时对象item变成了持久化,同时调用commit()时对持久化对象所做的变化与数据库进行了同步,hibernate获得了一个jdbc连接,并执行sql insert语句。save()函数将返回持久化实例的数据库标识符(取决于自己配置的标识符生成器)。

  session最终被close()方法关闭,item引用处于脱管状态。

  如果在事务发生期间发生异常了,hibernate对持久化对象所做的所有变化将进行数据库级别的回滚。要注意的是,hibernate将不会把内存变化会滚到持久化对象。因此需要放弃失败的session。

3、获取持久化对象

  

		Session session = sessionFactory.openSession();
		Transaction tx = session.beginTransaction();
		
		Object item = session.get(Message.class, new Long(1234));
		
		tx.commit();
		session.close();

  hibernate提供了get、load两种方法通过标识符获取持久化对象。获取到的对象处于持久化状态,一旦持久化上下文关闭,该对象将处于脱管状态。

  get和load的一个区别在于当无法找到给定标识符关联的对象时,get()方法返回一个null而load()方法将抛出ObjectNotFoundException。

  更重要的是load()方法始终试图返回一个代理,即不发生数据库命中而get()方法从不返回代理,每一次都将命中数据库。

4、修改持久化对象

  对持久化实例进行修改,当事务的commit()被调用时,所做的修改将被传播到数据库。这种机制叫做自动脏检查(意味着hibernate追踪并保存在持久化状态中对一个对象所作出的改变)。

5、使持久化对象变成瞬时对象

  

		Session session = sessionFactory.openSession();
		Transaction tx = session.beginTransaction();
		
		Message item = new Message();
		item.setText("msg1");
		Serializable itemId = session.save(item);
		
		Object obj = session.load(Message.class, (Long)itemId);
		session.delete(obj);
		
		tx.commit();
		session.close();

  调用delete()之后,这个对象处于移除状态(removed),此时不应该再继续使用它。commit()后,执行SQL DELETE操作。Session关闭后,该对象被认为是一个普通的瞬时实例。最终将被垃圾回收器收回。

  如果启用了hibernate.use_identifier_rollback配置选项,hibernate会在删除后设置被删除的对象的标识符属性为NULL,成为一个可以在后期被复用的干净瞬时实例。

Hibernate 接口