【转】Hibernate中重要对象的详解

★→→SessionFactory (org.hibernate.SessionFactory)

包含已经编译的映射(mappings),是制造session的工厂,可能含有一些可以在

各个事务(transaction)之间共享的数据

(1)SessionFactory的缓存

可分为两类:内置缓存和外置缓存。

SessionFactory的内置缓存中存放了Hibernate配置信息和映射元数据信息、同时也缓存了Hibernate自动生成的SQL语句等;

SessionFactory的外置缓存是一个可配置的缓存插件,在默认情况下,SessionFactory不会启用这个缓存插件。外置缓存

能存放大量数据库数据的拷贝,外置缓存的物理介质可以是内存或者硬盘。

(2)只有一个数据存储源,只需创建一个SessionFactory

SessionFactory就是个重量级对象,如果应用只有一个数据存储源,只需创建一个SessionFactory实例,

因为随意地创建SessionFactory实例会占用大量内存空间。

但是当你的项目要操作多个数据库时,那你必须为每个数据库指定一个SessionFactory。

(3)Configuration的其他用法

Configuration的configure()方法还支持带参数的访问方式,你可以指定hbm.xml文件的位置,而不是使用默认的classpath

下面的hibernate.cfg.xml这种方式,例如:

Configurationcfg=newConfiguration().configure("myexample.xml");

★★→→Configuration

Configuration是hibernate的入口,在新建一个Configuration的实例的时候,hibernate会在classpath里面查找

hibernate.properties文件,如果该文件存在,则将该文件的内容加载到一个Properties的实例GLOBAL_PROPERTIES里面,

如果不存在,将打印信息:hibernate.propertiesnotfound

然后是将所有系统环境变量(System.getProperties())也添加到GLOBAL_PROPERTIES里面。如果hibernate.properties文件存在,

系统还会验证一下这个文件配置的有效性,对于一些已经不支持的配置参数,系统将打印警告信息。

(1)作用---实现对Hibernate进行配置

?Configuration接口的作用是对Hibernate进行配置,以及对它进行启动

在Hibernate的启动过程中,Configuration类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。

?根据Configuration对象创建一个SessionFactory对象

为了能创建一个SessionFactory对象,你必须在Hibernate初始化时创建一个Configuration类的实例,并将已写好的映射文件交由它处理。

这样,Configuration对象就可以创建一个SessionFactory对象,当SessionFactory对象创建成功后,Configuration对象就没有用了,你可以简单地抛弃它。

(2)它是启动hibernate的对象

虽然Configuration接口在整个Hibernate项目中只扮演着一个很小的角色,但它是启动hibernate时你所遇到的第一个对象。

(3)Configurationconfig=newConfiguration();

config.addClass(Customer.class);

sessionFactory=config.buildSessionFactory();

或者:

使用方法链编程风格,可以改写为:

sessionFactory=newConfiguration().buildSessionFactory().addClass(Customer.class).buildSessionFactory();

注意:

方法链编程风格能使应用程序代码更加简捷。在使用这种编程风格时,最好把每个调用方法放在不同的行,否则在跟踪程序时,无法跳入每个调用方法中。

★★★→→Session(org.hibernate.Session)

(1)单线程的,短寿命的对象,代表了一次会话的过程。实际上是把一个JDBCConnection打包

了,它可以包含一些持久化对象的缓存

看作介于数据连接与事物管理一种中间接口.

在hibernate的设计者中.他们将session看作介于数据连接与事物管理的一种中间接口

或者想象成一个持久对象的缓冲区

hibernate能检测到这些持久对象的改变,并及时刷新数据库

(2)每一个Session实例和一个数据库事务绑定

通常将每一个Session实例和一个数据处理库事务绑定

就是说,每执行一个数据库事务(操作),都应该先创建一个新的Session实例.

如果事务执行中出现异常,应该撤消事务.

不论事务执行成功与否,最后都应该调用Session的close()方法,从而释放Session实例

占用的资源.

(3)如何获得Session对象

首先创建SessionFactory对象

应用服务器如果访问多个数据源时,则应该产生多个SessionFactory;

但是仅仅为了服务与某个请求时,不要创建一个新的SessionFactory,因为创建

SessionFactory需要消耗大量的资源.

然后根据SessionFactory再创建Session对象

例如:::::

----------------------------------------------------------------------------------

Sessionsession=sessionFactory.openSession();

Transactiontx;

try{

tx=session.beginTransaction();//开始一个事务

.......//执行事务

tx.commit();

}catch(Exceptione){//如果出现异常就撤消事务

if(tx!=null)

tx.rollback();

throwe;

}

finally//不管事务执行成功与否,最后都关闭Session并且放在finally中以提高安全性

session.close();

-----------------------------------------------------------------------------------

(4)Sessin接口中的常用方法

基本的CURD操作(save()方法:把Java对象保存数据库中、update()方法:更新数据

库中的Java对象、delete()方法:把Java对象从数据库中删除、load()方法:从数据

库中加载Java对象和find()方法:从数据库中查询Java对象);执行查询;

◆save()方法:save()和persist()方法产生SQLINSERT

session=HibernateUtil.currentSession();

tx=session.beginTransaction();

BookoneBook=newBook();

oneBook.setBookName(newString("J2EE应用开发".getBytes("gb2312"),"ISO8859-1"));

oneBook.setBookKind('1');

oneBook.setBookPrice(7.4f);

session.save(oneBook);

tx.commit();

◆?Sessin接口中的常用方法----updata()和merge()方法产生SQLUPDATE

该方法调用Session的load()方法,加载Customer对象,然后再修改Customer对象的属性。

session=HibernateUtil.currentSession();

tx=session.beginTransaction();

BookoneBook=(Book)session.load(Book.class,bookID);

oneBook.setBookName(newString("Java应用开发".getBytes("gb2312"),"ISO8859-1"));

oneBook.setBookKind('1');

oneBook.setBookPrice(10.4f);

tx.commit();

◆?Sessin接口中的常用方法----load和get方法

session的load和get方法根据给定的OID从数据库中加载一个对象,load方法在没有找到对象时抛出notFoundException异常,get方法返回null;

get和load和其他查询方法返回的对象位于session的缓存中,修改了对象的属性后,session清理缓存时,会根据持久化对象的属性来更新数据库。

用来对数据库中检索对象,load()和get()方法按照给定的OID加载一个持久化对象

publicIteratorgetAllCourses()throwsHibernateException

{

StringqueryString="selectcoursesfromCourseascourses";

beginTransaction();

Queryquery=session.createQuery(queryString);

Iteratorit=query.iterate();

returnit;

}

/**

*按course的名字进行模糊查找,返回的是包含有Course持久对象的Iterator。

*/

publicIteratorgetSomeCourse(Stringname)throwsHibernateException

{

StringqueryString="selectcfromCourseascwherec.namelike:name";

beginTransaction();

Queryquery=session.createQuery(queryString);

query.setString("name","%"+name+"%");

Iteratorit=query.iterate();

returnit;

}

◆?Sessin接口中的常用方法----delete()方法产生SQLDELETE

由于从数据库中删除对象对应的记录,如果出入的是持久化对象session就计划执行一个delete语句。

如果出入的参数是游离态对象,先使它成为持久化对象,然后计划执行一个delete语句。session只有在清理缓存的时候才会执行delete语句。

只有当调用session的close()方法时才会从session的缓存中删除对象。

session=HibernateUtil.currentSession();s

tx=session.beginTransaction();

BookoneBook=(Book)session.load(Book.class,bookID);

session.delete(oneBook);

tx.commit();

★★★★→→Transaction

★★★★★→→Query查询对象

Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本地数据库的SQL语句。

Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。

Queryquery=session.createQuery();

Listlist=query.list();//把query查询对象放到Query的list里面,返回一个query对象

★★★★★★Callback方面的接口

当一些有用的事件发生时――例如持久对象的载入、存储、删除时,Callback接口会通知Hibernate去接收一个通知消息---它允许

应用程序能对一些事件的发生作出相应的操作。例如Interceptor、Lifecycle和Validatable都是这一类接口。一般而言,

Callback接口在用户程序中并不是必须的,但你要在你的项目中创建审计日志时,你可能会用到它。

◎第一步.---->获取Sessionfactory对象

Sessionfactorysf=newConfiguration().configure().buildSessionFactory();

◎第二步.---->创建session对象

Sessionsession=sf.openSession();

◎第三步.---->获取对数据库操作前的事物对象

Transactiontx=session.beginTransaction();

◎第四步.---->利用session的多个方法进行数据操作.例如:session.save(实体bean对象);session.update(实体bean对象)等;

◎第五步.---->tx.commit();保存持久化数据库操作;

◎数据其他操作.比如查询Queryquery=session.createQuery("fromstudentwhereusername='"+username"'");//student为一个实体bean对象.就是与hbm.xml对应的和数据库映射的一个javabean.

其他接口::::::::::::::::::
:::::::::::::::::::::::::::::::::::::::::? 主键的生成 (IdentifierGenerator 接口) 

?本地SQL语言支持(Dialect抽象类)

?缓冲机制(Cache和CacheProvider接口)

?JDBC连接管理(ConnectionProvider接口)

?事务管理(TransactionFactory,Transaction,和TransactionManagerLookup接口)

?ORM策略(ClassPersister接口)

?属性访问策略(PropertyAccessor接口)

?代理对象的创建(ProxyFactory接口)

相关推荐