Hibernate个人学习笔记Word文档格式.docx
《Hibernate个人学习笔记Word文档格式.docx》由会员分享,可在线阅读,更多相关《Hibernate个人学习笔记Word文档格式.docx(51页珍藏版)》请在冰豆网上搜索。
1.1、Hibernate_first创建步骤
1、新建java项目
2、创建UserLibrary,加入如下jar
*HIBERNATE_HOME/hibernate3.jar
*HIBERNATE_HOME/lib/*.jar
*MySqljdbc驱动
3、创建hibernate配置文件hibernate.cfg.xml,为了便于调试最好加入log4j配置文件
位于:
hibernate-3.2\etc目录下
4、定义实体类User.java
5、定义User类的映射文件User.hbm.xml
<
hibernate-mapping>
<
classname="
com.tongji.hibernate.User"
>
<
idname="
id"
>
<
generatorclass="
uuid"
/>
/id>
propertyname="
name"
password"
createDate"
expireDate"
/class>
/hibernate-mapping>
6、将User.hbml.xml文件加入到hibernate.cfg.xml文件中
mappingresource="
com/tongji/hibernate/User.hbm.xml"
7、编写hbm2ddl工具类:
ExportDB.java将实体类→生成数据库表
publicstaticvoidmain(String[]args){
//读取hibernate.cfg.xml文件
Configurationcfg=newConfiguration().configure();
SchemaExportexport=newSchemaExport(cfg);
export.create(true,true);
}
8、开发客户端Client.java
为了方便跟踪sql执行,在hibernate.cfg.xml文件中加入
hibernate.show_sql"
true<
/property>
publicstaticvoidmain(String[]args){
//创建SessionFactory
SessionFactorysf=cfg.buildSessionFactory();
Sessionsession=null;
try{
session=sf.openSession();
//开启事务
session.beginTransaction();
Useruser=newUser();
user.setPassword("
jbjb"
);
user.setName("
不得了"
user.setCreateDate(newDate());
user.setExpireDate(newDate());
//保存数据
session.save(user);
//提交事务
session.getTransaction().commit();
}catch(Exceptione){
e.printStackTrace();
//回滚事务
session.getTransaction().rollback();
}finally{
if(session!
=null){
if(session.isOpen()){
//closesession
session.close();
}
}
}
}
1.2、步骤总结
实体类(持久化类)的设计
实体类与关系数据库的映射
应用的开发
1.3、Hibernate核心接口
1.3.1Configuration
Ø
概述:
Configuration类负责管理Hibernate的配置信息。
它包括如下内容:
❑Hibernate运行的底层信息:
数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等。
❑Hibernate映射文件(*.hbm.xml)。
Hibernate配置的两种方法:
❑属性文件(hibernate.properties)。
①调用代码:
Configurationcfg=newConfiguration();
❑xml文件(hibernate.cfg.xml)。
②调用代码:
Configurationcfg=newConfiguration().configure();
<
hibernate-configuration>
session-factory>
hibernate.connection.driver_class"
com.mysql.jdbc.Driver
hibernate.connection.url"
jdbc:
mysql:
//localhost/hibernate_first
hibernate.connection.username"
Root
hibernate.connection.password"
hibernate.dialect"
Org.hibernate.dialect.MySQLDialect
/session-factory>
/hibernate-configuration>
1.3.2SessionFactory
应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。
它在多个应用线程间进行共享。
通常情况下,是线程安全的,整个应用只有唯一的一个会话工厂——例如在应用初始化时被创建。
然而,如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂。
会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。
他的创建很耗时的,通常放在一个静态方法里面只创建一次
static{
try{
Configurationcfg=newConfiguration().configure();
factory=cfg.buildSessionFactory();
}catch(Exceptione){
e.printStackTrace();
调用代码:
SessionFactorysessionFactory=cfg.buildSessionFactory();
说明:
SessionFactory由Configuration对象创建,所以每个Hibernate配置文件,实际上是对SessionFactory的配置
1.3.3Session(会话)
❑Session不是线程安全的,它代表与数据库之间的一次操作,它的概念介于Connection和Transaction之间。
❑Session也称为持久化管理器,因为它是与持久化有关的操作接口。
❑Session通过SessionFactory打开,在所有的工作完成后,需要关闭。
❑它与Web层的HttpSession没有任何关系。
调用代码
Sessionsession=sessionFactory.openSession();
2.测试实体对象的生命周期
2.1junit简介:
*编写测试类xxxTest,需要继承TestCase
*编写单元测试方法,测试方法必须以test开头,测试方法不能含有参数和返回值,如:
publicvoidtestHello1(){}
*最好单元测试的代码单独建立一个目录
2.2了解Hibernate中CRUD操作
publicclassSessionTestextendsTestCase{
publicvoidtestSave1(){
Transactiontx=null;
Useruser=null;
try{
session=HibernateUtils.getSession();
tx=session.beginTransaction();
//Transient状态
user=newUser();
李四"
123"
user.setCreateTime(newDate());
user.setExpireTime(newDate());
//persistent状态,当属性发生改变的时候,hibernate会自动和数据库同步
王五"
//session.update(user);
mit();
}catch(Exceptione){
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
//detached状态
user.setName("
张三"
//persistent状态
session.update(user);
publicvoidtestReadByGetMethod1(){
//马上发出查询sql,加载User对象
Useruser=(User)session.get(User.class,"
402880d01b9bf210011b9bf2a2ff0001"
System.out.println("
user.name="
+user.getName());
龙哥"
publicvoidtestReadByGetMethod2(){
//采用get加载数据,如果数据库中不存在相应的数据,返回null
asdfsafsdfdsf"
publicvoidtestReadByLoadMethod1(){
//不会发出查询sql,因为load方法实现了lazy(懒加载或延迟加载)
//延迟加载:
只有真正使用这个对象的时候,才加载(发出sql语句)
//hibernate延迟加载实现原理是代理方式
Useruser=(User)session.load(User.class,"
发哥"
publicvoidtestReadByLoadMethod2(){
//采用load加载数据,如果数据库中没有相应的数据
//那么抛出ObjectNotFoundException
55555555"
System.out.println(user.getName());
publicvoidtestUpdate1(){
//手动构造的detached状态的对象
user.setId("
402880d01b9be8dc011b9be9b23d0001"
德华"
}
publicvoidtestDelete1(){
////手动构造的detached状态的对象
//Useruser=newUser();
//user.setId("
//user.setName("
//session.delete(user);
session.delete(user);
2.3了解get和load的区别?
*get不支持lazy,load支持lazy
*采用get加载数据,如果没有匹配的数据,返回null,而load则抛出异常
2.4Transient、persisten、detached的状态特征
transient状态的特征?
*在数据库中没有与之匹配的数据
*没有纳入session的管理
persistent状态的特征?
*persistent状态,当属性发生改变的时候,Hibernate会自动和数据库同步库
数据库中有与之匹配的数据
*纳入了session的管理
*在清理缓存(脏数据检查)的时候,会和数据库同步
detached状态的特征?
*在数据库中有与之匹配的数据
*没有纳入session的管理
2.5QueryTest
publicvoidtestQuery(){
Transactiontx=session.beginTransaction();
Queryquery=session.createQuery("
fromUser"
query.setFirstResult(0);
query.setMaxResults
(2);
ListuserList=query.list();
for(Iterator<
User>
iterator=userList.iterator();
iterator.hasNext();
){
Useruser=(User)iterator.next();
System.out.println(user.getId());
System.out.println(user.getName());
}
3、Hibernate基本映射
3.1映射关系
实体类---表
实体类中的普通属性---表字段
采用<
class>
标签映射成数据库表,通过<
id>
、<
property>
标签将普通属性映射成表字段
所谓普通属性指不包括自定义类、集合和数组等
注意:
如果实体类和实体类中的属性和sql中的关键字重复,必须采用table或column重新命名
3.2实体类的设计原则
*实现一个默认的(即无参数的)构造方法(constructor)
*提供一个标识属性(identifierproperty)(可选)
*使用非final的类(可选),final之后就不能继承了
*为持久化字段声明访问器(accessors)get、set方法
3.3主键生成策略:
uuid、native和assigned
uuid
用一个128-bit的UUID算法生成字符串类型的标识符,这在一个网络中是唯一的(使用了IP地址)。
UUID被编码为一个32位16进制数字的字符串。
native
根据底层数据库的能力选择identity,sequence或者hilo中的一个。
assigned
让应用程序在save()之前为对象分配一个标示符。
这是<
generator>
元素没有指定时的默认生成策略。
主键这个时候必须手动分配
4.hibernate多对一关联映射
4.1多对一关联映射的本质:
*将关联关系映射到数据库,所谓的关联关系是对象模型在内存中的一个或多个引用,多个用户(user)属于一个组(group)
many-to-one>
会在多的一端加入一个外键,指向一的一端,这个外键是由<
中的column属性定义的,如果忽略了这个属性那么默认的外键与实体的属性一致
publicclassUser{
privateintid;
privateStringname;
privateGroupgroup;
标签的定义示例:
*<
many-to-onename="
group"
column="
groupid"
many-to-one的映射最常用,也是最容易理解和编写的
column=“groupid”/>
生成的DDL语句如下
createtableT_Group(idvarchar(255)notnull,namevarchar(255),primarykey(id))
createtableUser(idvarchar(255)notnull,namevarchar(255),passwordvarchar(255),createTimedatetime,expireTimedatetime,groupidvarchar(255