hibernate笔记.docx
《hibernate笔记.docx》由会员分享,可在线阅读,更多相关《hibernate笔记.docx(78页珍藏版)》请在冰点文库上搜索。
hibernate笔记
第一章Hibernate基础
RelationalPersistenceforJava
持久化技术–Persistence
持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。
持久化的主要应用是将内存中的对象存储在关系型的数据库中,当然也可以存储在磁盘文件中、XML数据文件中等等。
JDBC(JavaDataBaseConnectivity)
Java语言访问数据库的一种规范,是一套API是一组标准的Java语言中的接口和类,使用这些接口和类,Java客户端程序可以访问各种不同类型的数据库。
比如建立数据库连接、执行SQL语句进行数据的存取操作。
POJO
(PlainOldJavaObjects)简单的Java对象,无参的构造方法setter和getter方法
ORM
Object/RelationMapping对象—关系映射
JAVA反射机制
反射,主要是指程序可以访问、检测和修改它本身状态或行为的一种能力。
Java中,反射机制(Reflection)使我们能够创建灵活的代码,这些代码可以在运行时自动匹配。
它也可以通过我们的程序代码获取对象本身的各类信息,如构造方法,字段,修饰符,方法等。
JPA
全称JavaPersistenceAPI.JPA通过JDK5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中。
搭建Hibernate4框架
1.添加jar
hibernate3.jar
hibernate3.0的核心jar包,常用的session,Query,Transaction都位于这个jar文件中。
antlr-2.7.6rc1.jar
ANTLR(ANotherToolforLanguageRecognition)是一个PCCTS制定的语言工具,它为他创建认定者,程序编译者,翻译者提供一个包括java,c#和C++在内的语法描述框架,使用from多态查询语句时需要它。
cglib-2.1.3.jar
CGL(CodeGenerationLibray)是一种高性能,高质量的代码产生库,Hibernate用它来实现po(persistentobject)字节码的动态生成。
asm.jar和asm-attrs.jar
ObjectWeb的字节码操纵框架,用来动态生成java代码。
commons-collections-2.1.1.jar
ApacheCommons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大
dom4j-1.6.1.jar
是一个JAVA的XMLAPI类似于jdom,用来读写XML文件,dom4j是一个非常优秀的JAVAXMLAPI,具有性能优异,功能强大和易使用的特点,同时它也是一个开放源代码的软件,可以在SourceForge上找到它
eheache-1.1.jar
EHCahe是一个纯JAVA的进程中的缓存,它具有经下特性,快速、简单、为hibernate充当可插入的缓存,最小的依赖性和全面的文档和测试
jta.jar
javaTransactionAPI(JTA)规范的包,是指定事务和事务处理和分布式事务处理系统之间的标准,JAVA接口,包括资源管理,应用服务,和事务应用程序。
commons-logging-1.0.4.jar
Jakarta的通用日志记录包
log4j-1.2.9.jar
Hibernate使用CommonsLoggingAPI可以使用log4j作为实施,log的机制,如果把log4j库放到上下文类目录中,commonsLogging就会使用log4j和它上下文类路径找到的log4j.properties文件。
log4j下载地址:
http:
//www.apache.org/dist/logging/log4j/
c3p0.jar
C3PO是一个数据库连接池,Hibernate可以配置为使用C3PO连接池。
如果你准备用这个连接池,就需要这个jar包
aas.jar
JAAS是用来进行权限验证的,已经包含在JDK1.4里面了。
所以实际上是多余的包
jdbc2_0-stdext.jar
JDBC2.0的扩展包,一般来说数据库连接池会用上它。
不过AppServer都会带上,所以也是多余的
jaxen-1.1-beta-7.jar
处理xml的xpath。
Hibernate执行原理:
2.src目录下创建hibernate.properties(连接数据库)
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:
mysql:
//localhost:
3306/hibernate?
useUnicode=true&characterEncoding=UTF-8
hibernate.connection.username=root
hibernate.connection.password=123456
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.show_sql=true
hibernate.hbm2ddl.auto=create
#hibernate.c3p0.acquire_increment=10
#hibernate.c3p0.max_size=20
#hibernate.c3p0.min_size=1
#hibernate.connection.driver_class=oracle.jdbc.driver.OracleDriver
#hibernate.connection.url=jdbc:
oracle:
thin:
@localhost:
1521:
orcl
#hibernate.dialect=org.hibernate.dialect.Oracle9Dialect
或者src目录下创建hibernate.cfg.xml(连接数据库)
xmlversion="1.0"?
>
DOCTYPEhibernate-configurationPUBLIC
"-//Hibernate/HibernateConfigurationDTD3.0//EN"
"
com.mysql.jdbc.Driver
jdbc:
mysql:
//localhost:
3306/hibernate
root
123456
org.hibernate.dialect.MySQLDialect
true
create
org.hibernate.connection.C3P0ConnectionProvider
--最大连接数-->
20
--最小连接数-->
5
--获得连接的超时时间,如果超过这个时间,会抛出异常,单位毫秒-->
120
--最大的PreparedStatement的数量-->
100
--每隔120秒检查连接池里的空闲连接,单位是秒-->
120
--当连接池里面的连接用完的时候,C3P0一下获取的新的连接数-->
2
--每次都验证连接是否可用-->
true
3.创建pojo,User.java
packagecom.pojo;
importjava.util.Date;
publicclassUser{
privateIntegerid;
privateStringname;
privateIntegersex;
privateDatebirthday;
publicIntegergetId(){
returnid;
}
publicvoidsetId(Integerid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicIntegergetSex(){
returnsex;
}
publicvoidsetSex(Integersex){
this.sex=sex;
}
publicDategetBirthday(){
returnbirthday;
}
publicvoidsetBirthday(Datebirthday){
this.birthday=birthday;
}
}
4.在pojo目录下,即同User类同目录下创建User.hbm.xml
xmlversion="1.0"?
>
DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD3.0//EN"
"http:
//www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
说明:
对上述User.hbm.xml:
(1)
Class标签指定该配置文件描述的实体类对象,name属性指定该实体类URL,table指定该文件描述的表名,schema表示该表所在的数据库用户名即只有该用户才可以操作该表;
dynamic-update(可选,默认为false):
指定用于UPDATE的SQL将会在运行时动态生成,并且只更新那些改变过的字段(只更新修改的字段,没有修改的字段不进行更新)。
表结构很大,经常被修改,而只是经常修改少量字段,这样会提交效率,否则修改时会扫描所有列数据;
dynamic-insert(可选,默认为false):
指定用于INSERT的SQL将会在运行时动态生成,并且只包含那些非空值字段(在添加记录时,只添加非null的字段)。
lazy(可选):
通过设置lazy="false",所有的延迟加载(Lazyfetching)功能将被全部禁用(disabled)。
5.主方法
packagecom.test;
importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.Transaction;
importorg.hibernate.cfg.Configuration;
importorg.hibernate.service.ServiceRegistry;
importorg.hibernate.service.ServiceRegistryBuilder;
importcom.pojo.User;
publicclassContrastConfig{
/*
*创建数据库连接工厂
SessionFactory由Configuration对象根据当前的配置信息生成。
SessionFactory对象一旦构造完毕,即被赋予特定的配置信息。
注:
构造SessionFactory很消耗资源,一般情况下一个应用中只初始化一个SessionFactory对象。
(单例模式创建)
*/
publicstaticSessionFactorysessionFactory=null;
publicstaticvoidcreate(){
//1.加载hibernate.cfg.xml
Configurationconfiguration=newConfiguration().configure();
ServiceRegistryserviceRegistry=newServiceRegistryBuilder().applySettings(configuration.getProperties()).buildServiceRegistry();
//2.加载hibernate.properties
//ServiceRegistryserviceRegistry=newServiceRegistryBuilder().buildServiceRegistry();
configuration.addClass(User.class);
//读取并解析映射文件,创建SessionFactory
sessionFactory=configuration.buildSessionFactory(serviceRegistry);
//sessionFactory=configuration.buildSessionFactory();
}
static{
create();
}
publicstaticvoidmain(String[]args){
Sessionsession=null;
Transactiontransaction=null;
try{
//打开session
session=sessionFactory.openSession();
//开启事务
transaction=session.beginTransaction();
//持久化操作
//Exceptioninthread"main"org.hibernate.MappingException:
Unknownentity:
demo01.User
Useruser=newUser();
user.setName("xiaoming");
//Session对象有一个一级缓存,显式执行flush之前,所有的持久层操作的数据都缓存在session对象处。
//故,当缓存中已保存有相同的数据时,仅执行一次
session.save(user);
session.save(user);
//提交事务
mit();
//等价于jdbc中Connnectin.setAutoCommit(false);
}catch(Exceptione){
transaction.rollback();e.printStackTrace();
}finally{
//关闭session和sessionFactory
session.close();sessionFactory.close();
}
}
}
说明:
使用XML文件进行配置时,可以在当中指定对象与数据库表格的映像文件位置,hibernate.cfg.xml文件的位置必须在Classpath即src下面下。
对该xml的读取,可以通过:
Configurationconfig=newConfiguration().configure();
Configuration的实例管理Hibernate的配置信息,通常用于建立SessionFactory,例如:
SessionFactorysessionFactory=config.buildSessionFactory();
SessionFactory中包括了数据库配置及映射关系,它的建立相当复杂,所以使用时需考虑到重用已建立的SessionFactory实例,SessionFactory是被设计为「线程安全的」(Thread-safe)。
预设的XML配置文件名称是hibernate.cfg.xml,您也可以自行指定文件,例如:
Configurationconfig=newConfiguration().configure("db.cfg.xml");
SessionFactorysf=config.buildSessionFactory();
hibernate.hbm2ddl.auto
这个属性标签中有四个参数可以写,这四个参数是对数据库中插入的进行不同的操作,分别为:
(1)create-drop
(2)create
(3)update
(4)validate
下面分别来介绍他们的作用以及对数据库中的影响
(1)create-drop表示在hibernate初始化时创建表格,程序运行结束的时候(sessionFactory.close())会删除相应的表格,在实际项目中不用
(2)create在hibernate初始化时会创建表格,在运行结束之后不删除表格,而是在下一次运行的时候如果有旧的删掉,没有旧的,重新建表格
(3)update只是根据映射文件去和数据库中的表对应起来,如果不一致,就更新表的结构
(4)validate校验映射文件和数据库中的表是不是能对应起来,如果不一致报错例:
表不存在报错,因为表与ORM不一致
c3p0连接池hibernate.properties
hibernate.c3p0.acquire_increment=10
hibernate.c3p0.max_size=100
hibernate.c3p0.min_size=1
标签常用属性
name:
类
table:
表
dynamic-update:
(可选,默认为false)。
(1)对update以及当saveOrUpdate执行update时来说,无论为true还是false,其结果都是用setXXX和预设默认值(剩余用null)覆盖表中所有原有字段。
(2)对merge方法来说,首先执行select语句查询数据库,如果值发生改变:
为true时,update语句只显示更新被更改的字段;为false时,update语句显示更新表中所有字段。
但结果都是用setXXX和预设默认值(剩余用null)覆盖表中所有原有字段。
(3)对Useru=(User)session.load(User.class,1);u.setName("John");mit();来说只执行不仅setXXX且被更改过的字段的update语句,如果setXXX但值没改变,则不执行update语句。
dynamic-insert:
(可选,默认为false),默认插入所有字段。
对save以及当saveOrUpdate和persist执行insert时来说:
为true时,指定用于insert的sql将会在运行时动态生成,并且只插入setXXX和预设默认值的那些非空字段,和生成的insert语句的字段相同。
反之,则insert所有字段。
lazy(可选):
通过设置lazy="false",所有的延迟加载(Lazyfetching)功能将被全部禁用(disabled)
④主键
selectmax(id)fromtable;
适用范围:
1.由于不依赖与底层数据库,适合所有的数据库系统。
2.多线程下不推荐适用。
3.OID必须为long、int或short类型,如果把OID定义为byte类型,抛异常。
由Hibernate从数据库中取出主键的最大值(每个sessio