Hibernate.docx
《Hibernate.docx》由会员分享,可在线阅读,更多相关《Hibernate.docx(81页珍藏版)》请在冰豆网上搜索。
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)){