hibernate30 自学完全文档Word文档格式.docx
《hibernate30 自学完全文档Word文档格式.docx》由会员分享,可在线阅读,更多相关《hibernate30 自学完全文档Word文档格式.docx(79页珍藏版)》请在冰点文库上搜索。
![hibernate30 自学完全文档Word文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/11/2bfcb169-f7f3-4f64-b953-4e5ac5b16587/2bfcb169-f7f3-4f64-b953-4e5ac5b165871.gif)
2缓存51
2.1缓存的原理51
2.2一级缓存52
2.3二级缓存54
3事务的处理56
3.1JTA事务和事务的边界57
3.2乐观锁和悲观锁61
3.3常见参数解释和常见问题64
3.4其他问题(HQL,监听器等)65
3.5annotation标注67
一hibernate入门
1.hibernate介绍
1.1引入
●模型不匹配(阻抗不匹配)
java面向对象语言,对象模型,其主要的概念有:
继承。
关联。
多态等;
数据库是关系模型,其主要的概念有:
表,主键,外键等
●解决的办法
1.使用JDBC手工转换
2.使用ORM(ObjectRelationMapping对象的关系映射)框架来解决、
1.2安装配置
●下载的地址www。
hibernate。
org本教程用3.2.5
●将下载目录的、hibernate3.jar和、lib下的hibernate运行时必须的包加入classpath中
antlr-2.7.6.jar,asm.jar,asm-attrs.jar,cglib-2.1.3.jar,dom4j-1.6.1.jar,commons-collections-2.1.1.jar,commons-logging-1.0.4.jar,ehcache-1.2.3.jar,
hibernate3.jar,jta.jar
1.3第一个程序
1.加入必要的包(看上节);
2.加入配置文件在F:
\软件\hibernate-3.2\eg\org\hibernate\auction\User.hbm.xml中找到模板的配置文件(放在你程序的包中)
3.加入系统的配置文件在F:
\软件\hibernate-3.2\etc\hibernate.cfg.xml问系统的配置文件,文件放在src目录下
4.配置系统配置文件的属性,属性在F:
\软件\hibernate-3.2\etc\
hibernate.properties文件中查看
例子一:
1)加载系统的配置文件(hibernate.cfg.xml)
<
!
DOCTYPEhibernate-configurationPUBLIC
"
-//Hibernate/HibernateConfigurationDTD3.0//EN"
hibernate-configuration>
<
session-factory>
<
propertyname="
connection.driver_class"
>
com.mysql.jdbc.Driver<
/property>
connection.url"
jdbc:
mysql:
//localhost:
3306/student<
connection.username"
root<
connection.password"
123<
dialect"
org.hibernate.dialect.MySQLDialect
mappingresource="
cn/com/hewei/domain/User.hbm.xml"
/>
/session-factory>
/hibernate-configuration>
2)新建bean文件
package.hewei.domain;
importjava.util.Date;
publicclassUser{
privateintid;
privateStringname;
privateDatebirthday;
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
publicStringgetName(){
returnname;
publicvoidsetName(Stringname){
this.name=name;
publicDategetBirthday(){
returnbirthday;
publicvoidsetBirthday(Datebirthday){
this.birthday=birthday;
}}
3)写配置文件(User.hbm.xml)
?
xmlversion="
1.0"
DOCTYPEhibernate-mappingPUBLIC
-//Hibernate/HibernateMappingDTD3.0//EN"
hibernate-mapping
package="
.hewei.domain"
classname="
User"
table="
user"
idname="
id"
column="
<
generatorclass="
native"
/id>
name"
birthday"
/class>
/hibernate-mapping>
4)写测试类
package.hewei.hibernate;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.Transaction;
importorg.hibernate.cfg.Configuration;
import.hewei.domain.User;
publicclassBase{
publicstaticvoidmain(String[]args){
//初始化类似注册驱动
Configurationcfg=newConfiguration();
cfg.configure();
//类似DriverManager
SessionFactorysf=cfg.buildSessionFactory();
//获得session
Sessions=sf.openSession();
//开始事物
Transactiontr=s.beginTransaction();
Useruser=newUser();
user.setName("
hewei"
);
user.setBirthday(newDate());
s.save(user);
//提交事务
mit();
s.close();
System.out.println("
end"
}
//运行后会自动将bean中的数据加入数据库
//在系统的配置文件中的property标签中加入
hbm2ddl.auto"
create<
//会自动创建表,但是每次都新建表
1.4hibernate开发的一些细节
1.开发的流程
1)由Domainobject-》mapping-》db(官方)
2)有db开始,由工具生成mapping和Domainobject(使用推荐)
3)有映射文件开始
2.domain的限制
1)必须要有缺省的构造方法
2)有一个id
3)非final得到,对懒加载有影响
3.映射文件的解析
hibernate-mappingpackage="
>
//package为包名
//class表示映射的bean,一个class就是一个类
//id表示主键,name表示属性名,cloumn表示表中的字段名,默认不写就和属性名一//generatorclass=”native”generator主键产生器,native是生成器的一种,它会自动增长
//property表示属性name表示属性名,cloumn表示表中的字段名
1.5hibernate工具类的书写
hibernate的源代码在src文件夹中
package.hewei.util;
importjava.io.Serializable;
importorg.hibernate.HibernateException;
publicfinalclassHibernateUtil{
privatestaticSessionFactorysessionFactory;
//不可新建
privateHibernateUtil(){};
//注册驱动只注册一次
static{
//初始化类似注册驱动
sessionFactory=cfg.buildSessionFactory();
//让外界访问sessionFactory
publicstaticSessionFactorygetSessionFactory(){
returnsessionFactory;
publicstaticSessiongetSession()
{
returnsessionFactory.openSession();
//增加
publicstaticvoidadd(Objectobj){
Sessionsession=null;
Transactiontx=null;
try{
session=HibernateUtil.getSession();
tx=session.beginTransaction();
session.save(obj);
mit();
}catch(HibernateExceptione){
if(tx!
=null)
tx.rollback();
throwe;
}finally{
if(session!
session.close();
}
//删除
publicstaticvoiddelete(Objectobj){
session.delete(obj);
}
//更新
publicstaticvoidupdate(Objectobj){
session.update(obj);
//根据主键更新
staticObjectget(Classclazz,Serializableid){
Sessions=null;
s=HibernateUtil.getSession();
Objectobj=(User)s.get(clazz,id);
returnobj;
//TODO:
handleexception
if(s!
=null)
s.close();
1.6Session接口的常用方法
Session的几个主要方法1.save,persist保存数据,persist在事务外不会产生insert语句,而save是产生数据再回滚的。
2.delete,删除对象3.update,更新对象,如果数据库中没有记录,会出现异常。
4.get,根据主键ID查,会立刻访问数据库。
//get函数必须传入id和class,因为class才能找到实体,才能找到映射文件,这样才能找到表和映射关系,也就可以查出表中的信息
5.Load,根据ID查,(返回的是代理,不会立即访问数据库)。
6.saveOrUpdate,merge(根据ID和version的值来确定是save或update),调用merge你的对象还是托管的。
调用.saveOrUpdate就变为持久的了7.lock(把对象变成持久对象,但不会同步对象的状态)。
save和persist的区别(在没有开启事务的前提下是有区别的,如果开启了事务,则效果是一样的。
)
save在没有开启事务的前提下,会将数据插入数据库,但是当发现事务没有开启的话,插入的数据就会立刻回滚。
persist在没有开启事务的前提下,不会产生insert语句。
saveOrUpdate
unsaved-value="
0"
get和load的区别
调用get()方法,会立刻访问数据库。
生成select语句。
调用load()方法,返回一个代理对象,只有在取得对象属性的时候才会真正的去访
例1取出user(get方法)
staticUsergetUser(intid){
ClassuserClass=User.class;
Useruser=(User)s.get(userClass,id);
returnuser;
}}
在配置文件中加入<
show_sql"
true<
运行的时候就可以输出sql语句
//如果你不知道是持久的还是托管的那么就使用updateOr
1.7实体对象的三种状态
对象的状态
瞬时(transient):
数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器回收,一般是new出来且与session没有关联的对象。
//刚新建的bean,和数据库没关系持久(persistent):
数据库中有数据与之对应,当前与session有关联,并且相关联的session没有关闭,事务没有提交;
持久对象状态发生改变,在事务提交时会影响到数据库(hibernate能检测到)。
//在session中,数据库中有数据了,会影响数据库脱管(detached):
数据库中有数据与之对应,但当前没有session与之关联;
托管对象状态发生改变,hibernate不能检测到。
//无session与之关联,但是数据库中有记录,这时候我们要更新的话就需要调用saveOrUpdate方法
1.8HQL和Criteria及分页
HQL(HibernateQueryLanguage)面向对象的查询语言,与SQL不同,HQL中的对象名是区分大小写的(除了JAVA类和属性其他部分不区分大小写);
HQL中查的是对象而不是和表,并且支持多态;
HQL主要通过Query来操作,Query的创建方式:
Queryq=session.createQuery(hql);
fromPersonfromUseruserwhereuser.name=:
name//替代了?
号//那么赋值的方式为query.setString(“name”,name);
fromUseruserwhereuser.name=:
nameanduser.birthday<
:
birthdayCriteriaCriteria是一种比HQL更面向对象的查询方式;
Criteria的创建方式:
Criteriacrit=session.createCriteria(DomainClass.class);
简单属性条件如:
Criteriaa=criteria.add(Restrictions.eq(propertyName,value)),Criteriab=criteria.add(Restrictions.eq(propertyName,otherPropertyName))
criteria.add(Restrictions.or(a,b));
//默认add是添加了与的关系,使用上句获得or的关系
例1根据姓名查询user(hql)
publicstaticvoidgetByName(Stringname){
//这里的User是类不是表
Stringsql="
fromUserasuserwhereuser.name=?
"
;
//创建处理的方法
Queryquery=session.createQuery(sql);
query.setString(0,name);
//注意从0开始和jdbc有区别
//list()和jdbc中executeQuery类似,如果确定user只有一个可使用Useruser=query.uniqueQuery();
List<
User>
list=query.list();
for(Useruser:
list)
{
System.out.println(user.getId());
}
例2根据姓名查询user(Criteria)
Criteriac=session.createCriteria(User.class);
//add加入一个约束条件,eq表示等于某个条件,gt为大于,lt为小于
c.add(Restrictions.eq("
name));
List<
list=c.list();
{
System.out.println(us