hibernate环境搭建.docx
- 文档编号:3988878
- 上传时间:2022-11-26
- 格式:DOCX
- 页数:13
- 大小:103.09KB
hibernate环境搭建.docx
《hibernate环境搭建.docx》由会员分享,可在线阅读,更多相关《hibernate环境搭建.docx(13页珍藏版)》请在冰豆网上搜索。
hibernate环境搭建
Hibernate简介
Hibernate是用来解决面向对象和关系数据库互不匹配的工具
简单的说,就是通过描述对象和数据库之间的映射关系,将对象自动持久化到数据库中
Hibernate环境搭建
1.首先new一个javaproject;
然后在项目下面new一个folder,命名为libs,把需要的所有jar包copy进来,然后buildpath构建路径
Jar包的位置:
在hibernate3.3.2文件夹下hibernate3.jar;在hibernate3.3.2---lib---required文件夹下有6个;apache-log4j-1.2.15文件夹下的log4j-1.2.15.jar;在slf4j-1.5.8文件夹下slf4j-log4j12-1.5.8.jar;连接数据库的驱动jar包:
oracle10g的是ojdbc14.jar,mysql的是mysql-connector-java-5.1.10-bin.jar;支持测试类的junit-4.7.jar;
2.hibernate的配置文件:
hibernate3.3.2.GA---project---etc文件夹下的hibernate.cfg.xml文件copy到src目录下(或者在src下直接new一个file命名为hibernate.cfg.xml),其内容依然在hibernate-3.3.2---documentation----manual---zh-CN---html_single---index.html页面上copy,如下:
根据不同的数据库需要修改数据库的连接和方言共有5项,具体内容可以在hibernate3.3.2.GA---project---etc文件夹下的hibernate.properties文件中copy。
根据实际情况把这个选项里的resource路径修改为正确的映射文件
注意:
xmlversion='1.0'encoding='utf-8'?
>
DOCTYPEhibernate-configurationPUBLIC
"-//Hibernate/HibernateConfigurationDTD3.0//EN"
"
--Databaseconnectionsettings-->
hsqldb:
hsql:
//localhost
--JDBCconnectionpool(usethebuilt-in)-->
--SQLdialect-->
--EnableHibernate'sautomaticsessioncontextmanagement-->
--Disablethesecond-levelcache-->
--EchoallexecutedSQLtostdout-->
--Dropandre-createthedatabaseschemaonstartup-->
3.配置日志文件,hibernate3.3.2.GA---project---etc文件夹下的log4j.properties文件copy到src目录下,打开并修改内容:
log4j.rootLogger=warn,stdout将warn修改为debug,显示程序运行的信息,如果修改为error则不显示信息,排除有列外的情况#debuginfor
4.在src下new一个package,命名为com.pb.domain,这里面存放持久化类和其对应的映射文件
配置映射文件,在这个package下new一个file,命名为Student.hbm.xml,最前面的Student就是其映射的持久化类的名字,必须相同;这个文件里的内容可以在hibernate-3.3.2---documentation----manual---zh-CN---html_single---index.html页面上copy,如下:
xmlversion="1.0"?
>
DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"
上面的class是对应的持久化类,id是主键,native表示主键根据不同数据库选择不同的策略,property是持久化类中的属性
注意:
上面的table和column是不必要的,只有当属性值与数据库的关键字冲突的时候才用来特别的区分一下,这就是八二原则;
5.启动和辅助类
在src下new一个package,命名为mon,用来存放辅助类和其他工具,
在这个package下new一个class命名为CreatTable,这个类主要是根据配置文件来生成数据的表,代码如下
publicclassCreatTable{
publicstaticvoidmain(String[]args){
Configurationcfg=newConfiguration().configure();
SchemaExportexport=newSchemaExport(cfg);
export.create(true,true);
}
}
在这个package下new一个class命名为HibernateUtil,这个类的主要作用就是得到SessionFactory,因为SessionFactory是一个重量级对象,它的每一次创建都是非常耗时耗资源的,所以在这里给它设置成唯一并且不可改变的即staticfinal具体代码可以在hibernate-3.3.2---documentation----manual---zh-CN---html_single---index.html页面上copy,如下:
importorg.hibernate.SessionFactory;
importorg.hibernate.cfg.Configuration;
publicclassHibernateUtil{
privatestaticfinalSessionFactorysessionFactory=buildSessionFactory();
privatestaticSessionFactorybuildSessionFactory(){
try{
//CreatetheSessionFactoryfromhibernate.cfg.xml
returnnewConfiguration().configure().buildSessionFactory();
}
catch(Throwableex){
//Makesureyoulogtheexception,asitmightbeswallowed
System.err.println("InitialSessionFactorycreationfailed."+ex);
thrownewExceptionInInitializerError(ex);
}
}
publicstaticSessionFactorygetSessionFactory(){
returnsessionFactory;
}
}
6.在项目下面new一个Sourcefolder,命名为test,这里存放的是测试类的源代码,在test下面new一个package,名字和需要测试的持久化类的包名保持一致,然后在该包下new一个class命名为StudentTest,在里面具体实现测试增删改查的功能;这个类需要extendsTestCase,然后每个功能的测试方法都以test开头,如testSave();这也是用到测试类的junit-4.7.jar;
到这里整个hibernate的环境就搭建完成,可以实现与数据库的连接和操作,在这里面用到了hibernate的几个接口和方法
Configure(),是读取配置文件获得一个Configuration对象,该对象包含了配置文件的所有信息,从而在数据库里能创建和持久化类结构相对应的数据库表;
SessionFactory,是一个重量级对象,在辅助类HibernateUtil中也可以看出我们用Configuration对象的buildSessionFactory()的方法来得到它,并且给它属性设置成唯一不变的;
Session,是会话,是对jdbc的connection的封装,对数据库的操作首先要开启会话才行,这里开启会话的方法有两个,一个是opensession(),这个方法是手动开启的,那么在对数据库的操作结束后是一定要手动关闭的,即session.close();而另一个getCurrentSession()方法是和事务Transaction绑定在一起的,也就是说当事务提交以后Tmit(),这个会话session也跟着关闭了,就不需要我们再去手动close了,当然这个方法是需要配置文件中的选项来支持的
Transaction事务是对会话内容的管理,它有提交方法commit()和回滚方法rollback()。
Hibernate框架的优点
代码简单,提高开发效率
使程序开发的过程更加面向对象(数据库表和持久化类的映射)
移植性强,在不同数据库上工作,只需要修改配置文件的5项内容即可
Hibernate缓存
一级缓存由Session控制
二级缓存是由SessionFactory控制,必须正确配置才可以使用
查询时使用缓存的实现过程为:
首先查询一级缓存中是否具有需要的数据,如果没有,查询二级缓存,如果二级缓存中也没有,此时再执行查询数据库的工作。
要注意的是:
此3种方式的查询速度是依次降低的。
一级缓存Session
Session每save一个对象,都会在数据库和自己的缓存中保留一份,之后再对这个save的对象修改,不论修改多少次,当遇到commit的时候,会把最后一次的修改做依据跟数据库同步,也就是说只发一条update语句,中间的修改忽略不计了;
实体生命周期的三个状态
一,瞬时状态、自由状态(Transient),即new一个对象的时候
二,持久状态(persistent),在数据库中存在这个对象,并且还保持在session的管理下
三,脱管状态、游离状态(detached),数据库中存在,但是已经脱离了session的管理
延迟加载
看下面的伪代码
Load的加载方式
load加载的默认属性lazy=”true”,当需要数据的时候先去缓存中找,如果没有才去select
Session.beginTransaction();
session.load(student.class,1);//此时没有发select语句
System.out.println(student.getId());//此时也没有发select语句,因为缓存中有该id
System.out.println(student.getName());//此时才去发select语句,缓存中此时不存在该数据
Session.getTransaction().commit();//如果把上面那句代码拿到commit()之后,就会报错,因为session已经关闭了,没有办法去发select语句
但是如果在commit之后重复上面那句代码,不会报错,因为此时缓存中已经有了该数据
get是没有lazy属性的,不管什么情况,只要使用了,就直接发select语句
对象的关联映射
onttoone人和身份证
manytoone学生和班级
onetomany班级和学生
manytomany用户和角色
manytoone
首先在实体类many这一端添加one一端的引用对象
然后在many的映射文件中添加标签
cascade是级联属性,即关联的对象和自己执行同样的操作,尽可能不用这个属性,可能会造成误操作,比方说delete的时候,会将关联一端的对象一并删掉;在不使用这个属性的情况下,一定要把关联的对象,转变成持久化状态,这样才可以引用关联对象
fetch=”join”表示取数据的时候发一条sql语句,
onetomany
首先在实体类one的一端添加一个set集合,里面存放的是many一端的对象
然后在one一端的映射文件中添加标签
实际上,在one这一段维护不方便,业务繁琐,一般将onetomany关系配置成双向的manytoone,它们在数据库中的表结构是一样的
inverse="true"表示one这一端放弃维护,只需要在many一端维护即可,避免了程序员的失误,造成重复操作,
manytomany
首先在每一段都要添加引用一段的set集合
然后在每一段的映射文件中添加标签
实体类User如下
实体类Role如下
其中table=”user_role”这是中间表,里面有两个字段user_id,role_id分别指向引用的两个表
HibernateTemplate模版
看下面代码
publicvoidsaveStudent(Studentstudent){
Sessionsession=null;
try{
session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.save(student);
session.getTransaction().commit();
}catch(HibernateExceptione){
//TODOAuto-generatedcatchblock
session.getTransaction().rollback();
e.printStackTrace();
}
在做CRUD(creat,retrieve,update,delete)操作时,唯一不同就是这句代码session.save(student);,其它的都一样;我们把一样的封装起来,不同的稍作改变,就形成了一个模版,具体的实现如下:
publicclassPBHibernateTemplate{
publicObjectexecute(HibernateCallbackcallback){
//参数是一个接口,这个接口使用此session来做CRUD
Sessionsession=null;
try{
session=HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Objectobject=callback.doinHibernate(session);//当调用这个模版的时候实现这个方法
session.getTransaction().commit();
returnobject;
}catch(HibernateExceptione){
session.getTransaction().rollback();
e.printStackTrace();
returnnull;
}
}
}
Hibernate实现增删改查的模版
implements
extends
extends
implements
过滤器OpenSessionInViewFilter
由于延迟加载的问题,当从数据库拿数据显示到前台页面时,session已经关闭,那么肯定得不到想要的结果,这个时候就要用到过滤器,session的开启和关闭都交给过滤器来完成;
这里就要提到ThreadLocal,它的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。
该变量被当前线程共享,这里的变量就是session;具体使用如下:
publicclassHibernateUtil{
privatestaticThreadLocalsessionHolder=newThreadLocal();
privatestaticfinalSessionFactorysessionFactory=buildSessionFactory();
privatestaticSessionFactorybuildSessionFactory(){
try{
//CreatetheSessionFactoryfromhibernate.cfg.xml
returnnewConfiguration().configure().buildSessionFactory();
}
catch(Throwableex){
//Makesureyoulogtheexception,asitmightbeswallowed
System.err.println("InitialSessionFactorycreationfailed."+ex);
thrownewExceptionInInitializerError(ex);
}
}
publicstaticSessionFactorygetSessionFactory(){
returnsessionFactory;
}
publicstaticSessiongetSession(){
Sessionsession=(Session)sessionHolder.get();
if(session==null){
session=getSessionFactory().getCurrentSession();
sessionHolder.set(session);
}
returnsession;
}
publicstaticvoidrelease(){
sessionHolder.remove();
}
}
Session设置成共享以后,在过滤器里控制它的开启和关闭
publicclassOpenSessionInViewFilterimplementsFilter{
publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,
FilterChainfilterChai
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- hibernate 环境 搭建