Hibernate.docx

上传人:b****7 文档编号:10853833 上传时间:2023-02-23 格式:DOCX 页数:81 大小:61.34KB
下载 相关 举报
Hibernate.docx_第1页
第1页 / 共81页
Hibernate.docx_第2页
第2页 / 共81页
Hibernate.docx_第3页
第3页 / 共81页
Hibernate.docx_第4页
第4页 / 共81页
Hibernate.docx_第5页
第5页 / 共81页
点击查看更多>>
下载资源
资源描述

Hibernate.docx

《Hibernate.docx》由会员分享,可在线阅读,更多相关《Hibernate.docx(81页珍藏版)》请在冰豆网上搜索。

Hibernate.docx

Hibernate

Hibernate简明参考

一.Hibernate介绍,语法

1.传统的JDBC操作

获取连接;

创建可执行对象;

执行数据库操作;

2.JDBC连接的工具化,JDBC操作的工具化

用公共类实现数据库的连接,查询,新增,更新,删除以及关闭连接操作.

3.JDBC连接的配置化

把连接信息配置在文本文件中,这样修改环境不需要重新编译java文件

把数据库操作封装在工具类中,业务不需要关心数据库连接环境。

(同第二种方法)。

4.连接池的引入

对操作结束后的连接不马上关闭,而是维持一个合理的空闲连接数,获取连接也不一定完全新建连接,可以从空闲连接池中获取.

5.POJO,数据的对象化

POJO在Hibernate语义中理解为数据库表所对应的DomainObject。

这里的POJO就是所谓的“PlainOrdinaryJavaObject"或者"PlainOldJavaObject”""",字面上来讲就是无格式普通Java对象,简单的可以理解为一个不包含逻辑代码的值对象(ValueObject简称VO)。

一个典型的POJO:

publicclassTUserimplementsSerializable{

privateStringname;

publicUser(Stringname){

this.name=name;

}

publicUser(){

}

publicStringgetName(){

returnthis.name;

}

publicvoidsetName(Stringname){

this.name=name;

}

....

}

6.持久层的对象化,持久层的框架化

数据操作不局限于表,列的形式,而可以把表映射为类的对象,

对数据库连接池,会话的管理实行统一的框架化;

7.Hibernate是什么?

2001年末,Hibernate第一个正式版本发布;作者为GavinKing

2003年6月8日,Hibernate2发布;2003年末被JBoss收购.

2005年3月,Hibernate3发布.

8.Hibernate的jar,软件环境

二.Hibernate的基本元素

Configuration---hibernate.cfg.xml

9.hibernate.cfg.xml或hibernate.properties默认的配置文件

只需选择一种形式的配置方式,properties形式的文件不配置mapping子节点,且不使用xml的格式:

一个典型的xml配置文件如下:

xmlversion='1.0'encoding='UTF-8'?

>

DOCTYPEhibernate-configurationPUBLIC

"-//Hibernate/HibernateConfigurationDTD3.0//EN"

"

--GeneratedbyMyEclipseHibernateTools.-->

root

jdbc:

mysql:

//localhost:

3306/test

org.hibernate.dialect.MySQLDialect

root

org.gjt.mm.mysql.Driver

true

create

othermappingelement...

-->

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPEhibernate-mappingPUBLIC

"-//Hibernate/HibernateMappingDTD3.0//EN"

"

对应的hibernate.properties文件为:

connection.usernameroot

connection.urljdbc:

mysql:

//localhost:

3306/test

dialectorg.hibernate.dialect.MySQLDialect

connection.passwordroot

connection.driver_classorg.gjt.mm.mysql.Driver

show_sqltrue

10.配置文件-----数据库连接配置

可以选择JDBC配置或者JNDI中的一种:

JDBC配置项:

dialect----数据库适配器,每个数据库略有不同

connection.driver_class---数据库驱动类

connection.url---数据库URL

connection.username---数据库用户名

connection.password---数据库登陆密码(对应的)

JNDI配置项:

dialect----数据库适配器,同上

connection.datasource---数据库JNDI名称

connection.username---数据库用户名,同上

connection.password---数据库登陆密码(对应的),同上

11.配置文件-----数据库连接池配置

目前Hibernate支持的4种连接池组件,除了Hibernate默认的都需要指出hibernate.connection.provider_class.

hibernate默认的(hibernate.properties文件为例):

hibernate.connection.pool_size2

 

C3P0

 

Dbcp(推荐)

 

Proxool

12.Transaction(事务管理)

hibernate.transaction.factory_class配置Transaction实例工厂类二选一.

JDBC的事务处理机制:

hibernate.transaction.factory_classorg.hibernate.transaction.JDBCTransaction

使用JTA

hibernate.transaction.factory_classorg.hibernate.transaction.JTATransaction

jta.UserTransactionjta/usertransaction

配置,Session相关

13.Configuration类(org.hibernate.cfg.Configuration类)

为了获取SessionFactory,一般只需执行一次.xml形式的配置文件比较方便:

Configurationconfig=newConfiguration().configure();

也可以指定一个文件进行加载,而不使用默认的hibernate.cfg.xml文件,

java.io.Filefile=newjava.io.File(“…..”);

Configurationconfig=newConfiguration().configure(file);

对应properties形式的配置方式必须手工加载映射文件,比如:

Configurationconfig=newConfiguration();

config.addClass(TUser.class);

14.SessionFactory(org.hibernate.SessionFactory接口)

SessionFactory顾名思义,就是session的工厂类.创建SessionFactory的实例就是调用已经装载了配置信息的Configuration对象的buildSessionFactory()方法:

Configurationconfig=newConfiguration().configure();

SessionFactorysessionFactory=config.buildSessionFactory();

Hibernate2中buildSessionFactory()方法声明了抛出异常.

SessionFactory对象中保存了配置信息.如果要使用多个数据库,需要针对每个数据库分别建立对应的SessionFactory实例,如果需要动态改变config文件,则需要动态重建SessionFactory的实例.

SessionFactory中还保存了二级数据缓存和StatementPool,它是线程安全的,所以一个数据库的SessionFactory一般作为单实例存在.

15.得到Session,Session的线程局部化

SessionnewSession=sessionFactory.openSession();

Session代表Hibernate的会话,作用就像JDBC的Conection对象.Hibernate2的find方法已经被废除.

Session是非线程安全的,所以不应该对同一个Session实例进行多线程同时调用.

HibernateUtil和静态SessionFactory一起工作,由ThreadLocal管理HibernateSession。

通过ThreadLocal类型来实现Session的线程独立.ThreadLocal在JVM内部维护一个Map,key是当前的线程对象,value是在当前线程中调用ThreadLocal对象的set方法时传递的参数.当调用ThreadLocal对象的get方法时,ThreadLocal对象会把当前线程对象的引用作为key从Map中取出绑定的对象.

packagecn.thinkmore.hibernate.session;

importorg.hibernate.Session;

importorg.hibernate.SessionFactory;

importorg.hibernate.cfg.Configuration;

publicclassHibernateUtil{

privatestaticSessionFactorysessionFactory;

static{

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

}

privatestaticfinalThreadLocalSESSIONCONTAINER=newThreadLocal();

publicstaticSessioncurrentSession(){

Sessionse=(Session)SESSIONCONTAINER.get();

if(null==se){

se=sessionFactory.openSession();

SESSIONCONTAINER.set(se);

}

returnse;

}

publicstaticvoidcloseSession(){

Sessionse=(Session)SESSIONCONTAINER.get();

if(null==se){

//SESSIONCONTAINER.set(null);

}else{

se.close();

}

}

}

在WebApplication中为了更好的管理Session的生命周期,可以把静态ThreadLocal对象定义在过滤器中,在进入过滤器时调用其set(新的Session);执行doFilter后,在调用get方法去除Session并进行关闭.在业务操作中,统一用过滤器的静态ThreadLocal获取Session,就保证了每一个request对象只能使用一个独立的Session.

由于一些EJB可能会运行在同一个事务但不同线程的环境中,所以这个方法不能照搬到EJB环境中.建议在托管环境中,将SessionFactory绑定到JNDI上.

三.ORM(Object/RelationalMapper)

16.OR映射---Hibernate基本数据类型

Hibernate基本类型

Java类型

标准SQL字段类型

boolean

boolean,java.lang.Boolean

BIT

yes_no

boolean,java.lang.Boolean

CHAR

(1)('Y'/'N')

true_false

boolean,java.lang.Boolean

CHAR

(1)('Y'/'N')

byte

byte,java.lang.Byte

TINYINT

short

short,java.lang.Short

SMALLINT

integer

int,java.lang.Integer

INTEGER

long

long,java.lang.Long

BIGINT

float

float,java.lang.Float

FLOAT

double

double,java.lang.Double

DOUBLE

big_decimal

java.math.BigDecimal

NUMBERIC

character

java.lang.String

CHAR

(1)

string

java.lang.String

VARCHAR

date

java.util.Date,java.sql.Date

DATE

time

java.util.Date,java.sql.Time

TIME

timestamp

java.util.Date,java.sql.TimeStamp

TIMESTAMP

calendar

java.util.Calendar

TIMESTAMP

calendar_date

java.util.Calendar

Date

clob

java.sql.Clob

CLOB

blob

java.sql.Blob

BLOB

binary

byte[]

VARBINARY,BLOB

text

java.lang.String

CLOB

seralizable

java.io.Serializable

VARBINARY,BLOB

class

java.lang.Class

VARCHAR

local

java.util.Locale

VARCHAR

timezone

java.util.TimeZone

VARCHAR

currency

java.util.Currency

VARCHAR

17.OR映射---实体映射示例

*.hbm.xml,主体内容包含表/类映射,id映射,属性字段映射三个部分.示例文件:

xmlversion="1.0"encoding="UTF-8"?

>

DOCTYPEhibernate-mappingPUBLIC

"-//Hibernate/HibernateMappingDTD3.0//EN"

"

XML文件头定义了文件的编码方式,DTD与Hibernate的版本有关,上面是使用hibernate3.x使用的DTD.

18.OR映射---表/类映射

name:

指定了Java数据封装的POJO类类型.

table:

指定了数据库的表名

19.OR映射---id映射

name:

指定了映射POJO类的属性名,

type:

POJO类中属性的数据类型;

column:

数据库表的主键字段;

generator子元素:

由其class属性指定主键生成方式:

Øassigned:

主键由应用程序产生,不需要hibernate干预

Øidentity:

使用数据库的主键生成机制,如MySQL,DB2、SQLServer的自增主键.

Øsequence:

使用数据库的sequence机制,如Oracle的sequence

Øuuid.hex:

由Hibernate基于128位唯一值产生算法,根据ip,时间,jvm启动时间,内部自增量生成十六进制的数值,编码后成为一个32位长的字符串.该方法提供了最好的数据库插入性能和数据库平台适应性.

Øuuid.string:

与uuid.hex类似,只是生成的主键没有进行编码,只有16位长度.在某些数据库可能出错.

Øhilo:

通过hilo算法实现主键生成,需要额外的数据库表保存主键生成历史状态.

Øseqhilo:

与hilo类似,只是主键历史状态保存在sequence中,适用于支持sequence的数据库.

Øincrement:

主键按数值递增,但如果多个实例同时访问同一个数据库,各自生成主键,则容易造成主键重复.

Ønative:

由hibernate根据数据库适配器中的定义,自动采用identity,hilo,sequence中的一种方式,native定义的主键ID为int型

Øforeign:

外部表的字段作主键.

Øselect:

hibernate3中新增的.需要提供一个唯一的标识字段进行二次读取,以获取触发器生成的主键值,通过param子元素进行定义,比如:

key_field

该方法主要针对遗留系统的改造工程,一些早期的系统主键依赖于触发器生成.当数据库insert时,触发器捕获这一操作,并为主键赋值,在插入数据库后,再次读取某一识别字段读取已经插入的数据,获取其主键值.

20.OR映射---复合主键映射(composite-id)---实体属性组成主键

复合主键使用将取代id元素,并具有property属性列表.

复合主键的POJO类需要实现equals和hashcode方法,可以使用apachecommonslang包中的工具类实现(commons-lang.jar),比如:

importmons.lang.builder.EqualsBuilder;

importmons.lang.builder.HashCodeBuilder;

importmons.lang.builder.ToStringBuilder;

...

publicStringtoString(){

returnnewToStringBuilder(this)

.append("userid",getUserid())

.append("when",getWhen())

.toString();

}

publicbooleanequals(Objectother){

if(!

(otherinstanceofMyPoJoClass)){

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 营销活动策划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1