Hibernate理论基础

 
Hibernate理论基础 yE
1. 什么是hibernate? /b
2. hibernate的知识内容 [?bp
3. 什么是对象持久化?对象持久化有什么用?(解决的问题) 2t[:'t
4. 如何对象持久化? d>)oO5
5. 如何用数据库的方法做对象持久化? WO
6. ORM(对象关系映射)是什么?有什么作用? 3
7. ORM从对象到表所要考虑的问题 Bcs=n
8. 什么是ORM框架?有什么用? @.Ux
9. 使用hibernate的方法做对象持久化的工作,程序员应该怎么做? :b
10. hibernate有什么用? b{$s]O
11. 程序员和hibernate的整体工作流程 c
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  s
什么是hibernate: R
持久化的框架,属于设计方面的内容,类库,用来做对象持久化的,什么是对象持久化呢? `?0
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  '
Hibernate的知识内容: +k0EP
语法部分(类库) =4v4v6
程序设计思想,也就是持久层的设计 wH%T
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  ajv"Z
什么是对象持久化?对象持久化有什么用?(解决的问题): .s
发现问题: aK
程序设计的架构: 表现层—业务层—持久层—数据库层,其中表现层和业务层是JVM来执行,应用程序会产生许多的对象,如果断电了,对象就消失了,也就是说在内存中的对象是不稳定的,状态不能持久 ;g
发现问题: M|J/%
将一个对象从A电脑复制到B电脑,如何做到呢? ;y5)
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  +q1
那么有三种方法解决上面的问题: ,vaK{
1. 序列化: 通过网络传递,或者硬盘共享 V
2. 存储到数据库中,谁想用,从数据库中拿 ]v,
3. EJB Entity Bean(实体Bean) U9uB
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  k>DS
序列化的方法比较死板:如果当一个对象的结构比较复杂的时候,我们这时只需要一部分内容,没有办法,只能整个写入到文件,整个读取 +#L+It
序列化的缺点: 不能检索,不能分离一个对象,不方便共享 *_
所以说第一种方法只能用于做临时的持久化,简单的传输,但不适合复杂的持久化工作 |3
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  sk
第二种方法(数据库持久化):检索方便,分布式共享,永久数据 TSU3ZO
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  o;/=0
总结: BE
什么是对象持久化: 对象持久化就是把内存中的对象永久的保存起来,保护对象的状态,方便使用 @ +
对象持久化有什么用: 1.解决掉电的问题 2.共享方便 3.保证对象安全检索方便 wb
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  ?5[Z?
如何对象持久化: Y|z5hW
1. 对象序列化 EI^Ugx
2. 数据库(JDBC,EJB,Hibernate) S2
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  -f=
如何用数据库的方法做对象持久化: _
1. JDBC {xZ1(
发现问题: 需要做大量的工作,难度大 dOr
2. EJB ea2STt
使用的是其中的一个功能来做持久化,解决了使用JDBC方法的的大量工作的问题 @$.N
发现问题: EJB是重量级的组件,要使用它,有两个问题 1.成本 2.性能 IC~%oj
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  3
发现问题: 以上两种方式还有个共同的问题,对象不是简单存储在数据库中的,比如多态的特点就不能处理 A b=new B(); B为A的子类 v
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  ChC
3. Hibernate T.H
解决了以上的所有问题,作用:1.不用做大量的工作 2.移植性能好 3.提高了代码的质量,简单 4.检索共享重用成本调试 '|g
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  ]M6ev!
ORM(对象关系映射)是什么?有什么作用? YV
发现问题: ^u
java中的对象的属性类型和数据库中的字段类型是不一样的,那么如何来存储java中的对象呢?这就需要做对象关系的映射,也就是ORM b[
什么是ORM: 将内存中的对象和数据库做转化,这样就实现了java与数据库之间的访问等功能 7lGZb[
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  }t
ORM从对象到表所要考虑的问题: "r6
Orm的复杂问题: v)Qgf
1. 数据库如何保证对象的唯一性:在内存中,两个对象属性值都一样,但是内存地址不一样,可以做区分,但是在数据库中如何分辨呢? Ej((
2. 继承关系如何转化 yTMX[i
3. 集合如何映射呢? Y|_"Wb
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  -(2K
什么是ORM框架?有什么用? c?D3~i
就是一个类库,通过这个类库完成持久化层的设计 baAs|D
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  "T
使用hibernate的方法做对象持久化的工作,程序员应该怎么做? d
1. 将ORM方案定下来,就是类到数据库的转化 2.利用hibernate生成代码 }N
hibernate有什么用? 2f7
1. 完成jdbc的代码 4]$
2. 管理持久化对象的状态
3. 提供一个查询的API 80XVA+
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  3
程序员和hibernate的整体工作流程 m
程序员: "q:h(
1. 设计ORM方案 1u
2. 写配置文件 IyHa
3. 调用Hibernate的API,向Hibernate发出命令 S
hibernate: J6.AvF
4. 读配置文件 ]&7/<z
5. 生成jdbc代码 #Q
6. 执行 B$
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  dV5,
Hibernate简单实例 .N3VH}
Hibernate语法: f:UT
作用: 数据库的增删改查 HQL面向对象的查询语句 =QYoJl
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  R
大致步骤: sf1'8
1. 设置环境 类库 r|+L)P
2. 定义映射 lsr[N
A 定义映射的实体po z
B 建立数据库表 )y
C 写XML配置文件(表,数据库) RC?uL
3. 调用Hibernate API >]6|
A 管理po的状态(增删改,恢复po状态) B)
B 检索(查询) d+,
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  $Q
Hibernate第一个简单的实例: 引例(frisHbn包) r
1. 设置环境 wC<'0p
hibernate配置环境需要的资源 CCmm9b
Hibernate的jar包: lib.zip dtd.zip: dtd.zip可以不设置 }
2. 定义映射 i$^
建立项目: e:#
bussiness包: entity包 Biz包业务 >X
client包: 测试 .AuL[`
util包: 工具 Ez
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  0
先写持久化类: 以花为实体,建立花类,并且建立数据库表 ].
/** ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  a/
* 建表语句: :
* CREATE TABLE T_FRUIT( {
FID NUMBER(10) PRIMARY KEY, ;/"p
NAME VARCHAR(20) NOT NULL, B
COMMENTS VARCHAR(50), Tp
PRICE NUMBER(5) NOT NULL $@e'
); u#&|kj
*/ ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  xxY[d
package Yuchen.fristHbn.business.entity; x*M
//持久化类(花类),注意因为采用的是hilo的方式获得id,所以需要有setid的方法 y
public class Fruit { BR4<7
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  :J^
private Integer fid;//hibernate中的id不能识别int ;VK~yQ
private String name; ogS-/
private String comments; 3(K]YQ
private int price; $S9h%,
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  6;C0
public Fruit() { s7T"zs
super(); d/
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛   {
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  tWdPUE
public Fruit(String name, String comments, int price) { _^h`J
super(); 9v?A
this.name = name; v
this.comments = comments; jFf
this.price = price; 0
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  0T`
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  h
public String getComments() { =
return comments; .
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  -Ds
public void setComments(String comments) { 0
this.comments = comments; fk<#
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  51z,:{
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  Y?+
public Integer getFid() { .
return fid; G{
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛   bj
public String getName() { s/_mY
return name; s
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  9=rHcM
public void setName(String name) { (
this.name = name; }@
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  0iD
public int getPrice() { S=^a
return price; Hlr6Nx
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  +G47
public void setPrice(int price) { f<QL>i
this.price = price; X{|{L
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  BXo
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  vqnK
public void setFid(Integer fid) { o(*2
this.fid = fid; :<@q
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  mv
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  "<6u/
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  e5
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  X<D[_+
使用hilo的方式获得id: m$UBIb
建表语句: ]
CREATE TABLE T_HILO(HILO_ID NUMBER(10)); 2/3bU
INSERT INTO T_HILO valueS(1); ]p>+7)
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  [Pq]d
写hibernate的连接数据库的配置文件: q-=#g
<?xml version="1.0"?> Kdd5(
<!DOCTYPE hibernate-configuration PUBLIC rm
"-//Hibernate/Hibernate Configuration DTD 3.0//EN" =^h.u
" http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> S0
<hibernate-configuration> )/=&|
<session-factory> 7ws-
<property name="show_sql">true</property> <K
<property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> &d
<property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:name</property> I$k41
<property name="connection.username">scott</property> f[~
<property name="connection.password">tiger</property> /[
<property name="connection.isolation">2</property> :!1
<property name="dialect">org.hibernate.dialect.Oracle9Dialect</property> ,4
<mapping resource="Yuchen/fristHbn/business/entity/Fruit.hbm.xml"/> DclL
</session-factory> ,v]r
</hibernate-configuration> anr
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  D%VB
写映射配置文件: UY4+
<?xml version="1.0"?> b
<!DOCTYPE hibernate-mapping PUBLIC )<9
"-//Hibernate/Hibernate Mapping DTD 3.0//EN" 9
" http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> /%ek@+
<hibernate-mapping package="Yuchen.fristHbn.business.entity"> y
<class name="Fruit" table="T_FRUIT"> LOQo2
<id name="fid" column="fid"> ZU;
<generator class="hilo"> pf$N
<param name="table">t_hilo</param> E~_j
<param name="column">hilo_id</param> ^V.!G
</generator> Gmq#
</id> g_TvI^
<property name="name" column="name" /> "~
<property name="comments" column="comments"></property> Z7=2#2
<property name="price" column="price"></property> 1sE[<
</class> HM%m
</hibernate-mapping> @]
A. 类名—表名 v
B. id—id 获得id的方式 详细信息(如: hilo的表名和字段) FjLT
C. 属性—字段 D?!r
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  y!mS
使用hibernate API(FruitManager.java): KTH;kt
package Yuchen.fristHbn.business.Biz; a?GA
//业务逻辑类:负责增删改查通过使用hibernate API进行 #NIAf9
import org.hibernate.Session; #pI-
import org.hibernate.SessionFactory; !Dg
import org.hibernate.Transaction; @dm?
import org.hibernate.cfg.Configuration; jS
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  g
import Yuchen.fristHbn.business.entity.Fruit; )
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  *'`xf
public class FruitManager { LP!,
public void insert(Fruit fruit){ gy">dU
Configuration config=new Configuration(); SBe>
config.configure();//读配置文件 c|Y
SessionFactory sf=config.buildSessionFactory();//得到工厂 ~]f^ko
Session session=sf.openSession();//得到session ,O^H
Transaction tt=session.beginTransaction();//检查事务开启 TicNh
session.save(fruit);//存储insert Y'er
tt.commit();//提交 ^t-I.
session.close();//关闭资源 "D
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  `b
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  '
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  @Y[
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  89Kz[W
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  -
写测试类: 插入一个对象到数据库中 A
/** ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  |]P
* 知识点: |
* hibernate基础:练习语法部分API和简单的映射关系 Af
* 程序目标: .[^m
* 使用hibernate方法将对象进行持久化 j,<
* 实现数据库的增删改查 Isf|%G
* API: }8
* 1.Configuration:这个类负责读取XML文档(映射配置文件) X()%Cn
* configure():读xml =/ y:
* buildSessionFactory():创建一个生产session对象的工厂,其实是再次检查 )t-U8
* 因为hibernate和jdbc不一样,jdbc是如果不手动设置开启事务,那它 !=m
* 就是马上执行sql的,hibernate的不会马上执行,是事务提交后执行 ]VG-
* 默认情况下就是打开事务的状态,这里只是再检查以下 om]
* 2.SessionFactory:负责生产session对象 ;?*]{
* openSession():创建一个session ^fa31F
* 3.Session类:这个是主要的类,负责增删改查,开启事务等 oH"S-
* beginTransaction():产生一个事务对象(Transaction) N
* save():增加相当于操作sql中的insert语句 <k+6
* 4.Transaction类:负责管理事务的 Z7{
* commit():提交一个事务 Ulv
* ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  P
*/ ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  -
package Yuchen.fristHbn.client; O
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  U
import Yuchen.fristHbn.business.Biz.FruitManager; Z
import Yuchen.fristHbn.business.entity.Fruit; iAKqF
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  j(X
public class Test { _u8S
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  ooD.
public static void test1(){ *e_JpP
Fruit fruit=new Fruit("lisi","hello",100); kl
// fruit.setName("zhangsan"); '|p%
// fruit.setComments("hello"); l
// fruit.setPrice(100); +3Mf.
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  30Pg
FruitManager fm=new FruitManager(); /y=YWD
fm.insert(fruit); U
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  Js
public static void main(String[] args) { #`+
// TODO 自动生成方法存根 ise
Test t=new Test(); Y+O
t.test1(); 4QxWj
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  W2Ve
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  #
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  3
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  9I
hibernate API(一): &c3l5
Configuration: 读取配置文件信息用来初始化的 e].(
SessionFactory: 重量级对象,特点:消耗资源大,线程是安全,所以可以被共享 Y.e/P[
上面两个对象只实例化一个就行了,都是用于初始化的 g
Session: 线程是不安全的,所以要避免多个线程共享它,是轻量级的对象,使用后关闭 ub2
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  /4'gRP
Session对象的状态: SfZ +
顺态: 还没有被持久化,也就是说数据库中没有该对象的记录,并且Session中的缓冲区里没有这个对象的引用 cTa3
持久态: 在数据库中有该对象的记录,并且在session中的缓冲区里有这个对象的引用,和顺态正好相反 p#W
游离态: 在数据库中有记录,但是不在session的缓冲区里 p2MB
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  34}."
对象状态的转换: v$F
做一个工具类,将hibernate中重复的代码包装起来: A<exA
package Yuchen.fristHbn.util; WF
//生产session对象的工具类 9
import org.hibernate.Session; e
import org.hibernate.SessionFactory; I$)
import org.hibernate.cfg.Configuration; R$A%~
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  ~t02i
public class HbnUtil { szsDO6
private static SessionFactory sf; *J
static{ I$>
sf=new Configuration().configure().buildSessionFactory(); 3/FV0w
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  <isX{s
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  G27)>
public static Session getSession(){ je5
return sf.openSession(); 6+@1=
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  Uef+Gn
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  T~}
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  VXv/UG
完善FruitManager类: 6<~9
package Yuchen.fristHbn.business.Biz; %hOb/
//业务逻辑类:负责增删改查通过使用hibernate API进行 ZsE
import org.hibernate.Session; '-
import org.hibernate.SessionFactory; &<XT>
import org.hibernate.Transaction; Sww$4^
import org.hibernate.cfg.Configuration; t
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  JJ"&Tj
import Yuchen.fristHbn.business.entity.Fruit; Ayun0V
import Yuchen.fristHbn.util.HbnUtil; 4
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  >qg]Eg
public class FruitManager { 4cH)
public Integer insert(Fruit fruit){ #y+pK
Session session=HbnUtil.getSession();//通过工具更方便了 /
Integer id=null; wE
// Configuration config=new Configuration(); PA8/C
// config.configure();//读配置文件 ~3
// SessionFactory sf=config.buildSessionFactory();//得到工厂 v08`%Y
// Session session=sf.openSession();//得到session #ir&
Transaction tt=session.beginTransaction();//检查事务开启 1Y8
id=(Integer)session.save(fruit);//存储insert =@<+I
tt.commit();//提交 ~
session.close();//关闭资源 5
return id; 9kUX
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  2K?-v$
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  vm}t
public Fruit selectId(Integer id){ Z,
Session session=HbnUtil.getSession(); #F
Transaction t=session.beginTransaction(); FN>rh%
Fruit fruit=(Fruit)session.get(Fruit.class, id); y+&wHd
t.commit(); "|Q!g
session.close(); cO}
return fruit; %.
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  HYzjRK
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  sQe;zv
public void remove(Fruit fruit){ gG+]K
Session session=HbnUtil.getSession(); Otjh
Transaction t=session.beginTransaction(); X'_Ko
session.delete(fruit); 6/Q;
t.commit(); V
session.close(); z8bjA
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  Lm&O
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  z
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  +I[
测试对象状态的转换: 1+.[
/** ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  Zu4{
* 知识点: +fN
* hibernate基础:练习语法部分API和简单的映射关系 3mJkJ
* 程序目标: D&!n
* 使用hibernate方法将对象进行持久化 (9vx)
* 实现数据库的增删改查 =Z
* API: :
* 1.Configuration:这个类负责读取XML文档(映射配置文件) ^9{|+
* configure():读xml &)
* buildSessionFactory():创建一个生产session对象的工厂,其实是再次检查 sw Tx
* 因为hibernate和jdbc不一样,jdbc是如果不手动设置开启事务,那它 s
* 就是马上执行sql的,hibernate的不会马上执行,是事务提交后执行 Fl
* 默认情况下就是打开事务的状态,这里只是再检查以下 4+:
* 2.SessionFactory:负责生产session对象 d
* openSession():创建一个session b?k`
* 3.Session类:这个是主要的类,负责增删改查,开启事务等 _0K`r
* beginTransaction():产生一个事务对象(Transaction) GV Xas
* save():增加相当于操作sql中的insert语句 taZ
* 4.Transaction类:负责管理事务的 l=95
* commit():提交一个事务 %*e
* test1():测试插入的功能 X
* test2():测试数据同步更新的功能 y
* test3():测试saveOrUpdate() !Z]6G
* test4():测试clear()和flush() r/v9E
*/ ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  jIL/z
package Yuchen.fristHbn.client; %*@^N
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  Bj'c-
import org.hibernate.Session; D4]Ib
import org.hibernate.Transaction; GRc+|p
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  ~ZQ
import Yuchen.fristHbn.business.Biz.FruitManager; *eaubD
import Yuchen.fristHbn.business.entity.Fruit; `>+:
import Yuchen.fristHbn.util.HbnUtil; 9r2
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  x{1
public class Test { x}o`.V
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  Lcu2
public void test1(){ smAg
Fruit fruit=new Fruit("lisi","hello",100); Y]m!29
// fruit.setName("zhangsan"); 2](@@.
// fruit.setComments("hello"); Q:wG
// fruit.setPrice(100); 'LXb
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  ]b*
FruitManager fm=new FruitManager(); j
fm.insert(fruit); :"
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  tMG
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  &o
public void test2(){ [5~10z
//测试同步更新的功能 [>8d
Fruit fruit=new Fruit("meigui","hongse",70);//顺态 1
FruitManager fm=new FruitManager(); J9.
Fruit fruit2=new Fruit(); [T}
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  .3b;
Integer id=fm.insert(fruit); M/_/O
fruit2=fm.selectId(id); Wd
System.out.println(fruit2.getFid()); i@EX
System.out.println(fruit2.getName()); L |#
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  &^}
fruit.setName("ziluolan");//这里修改了对象 ekU,+Q
fruit2=fm.selectId(id); '?
System.out.println(fruit2.getFid());//但是结果没有更新 /`Y?
System.out.println(fruit2.getName()); 8I
//因为fruit在Integer id=fm.insert(fruit);后变成游离态了 NG
//也就是说只有持久态才能实现同步更新 c
System.out.println(fruit.getFid()); An
System.out.println(fruit.getName()); +Ix]
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  iWRHLw
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  ZY>C5E
public void test3(){ I
Session session=HbnUtil.getSession(); SS)
Transaction t=session.beginTransaction(); N+GO
Fruit fruit=new Fruit("ziluolan","lanse",100);//顺态 )Y?
Fruit fruit2=new Fruit(); H<
FruitManager fm=new FruitManager(); }r
session.save(fruit);//fruit在运行完此句后变为游离态 9d@K0E
fruit2=(Fruit) session.get(Fruit.class, fruit.getFid()); +.h
//从数据库读并打印出来 kAr~
System.out.println(fruit2.getFid()+":"+fruit2.getName()); 7T[
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  ?
session.saveOrUpdate(fruit);//如果该对象为游历态就更新数据库update <
//否则就是顺态,增加insert =! S?
fruit2=(Fruit) session.get(Fruit.class, fruit.getFid()); m]Xb
//saveOrUpdate后再从数据库读并打印出来 fo
System.out.println(fruit2.getFid()+":"+fruit2.getName()); v
//两个打印结果一样,saveOrUpdate方法判断如果id为null,就 |CY
//顺态,否则就是游离态 Dm
t.commit(); 17
session.close(); q
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  0H
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  Od
public void test4(){ 6
Session session=HbnUtil.getSession(); O.Z/r
Transaction t=session.beginTransaction(); UiX
Fruit fruit=new Fruit("guihua","fense",300);//顺态 #"O
Fruit fruit2=new Fruit(); lG,
session.saveOrUpdate(fruit);//执行insert因为对象为顺态 I:r
// session.flush(); !6`}
session.clear();//fruit变成游离态了,并且不会执行insert语句 ,x<,Y<
//因为hibernate不是马上执行sql,而是等t.commit()提交事务 7J
//后才执行,clear后,对象为游离态 `PD
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  NUH$g
session.saveOrUpdate(fruit);//这里验证上面的话,执行update Ud piA
//做个select查看一下,可以证明,因为clear后,没有马上执行 V-Y#a
//sql语句,所以表里没有数据,这里update也没有用,所以表中 s"
//一个对象也没插入,但是如果加入flush()刷新就是马上执行sql了 (CdCqx
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  )
t.commit(); ybc
session.close(); V
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  H
public static void main(String[] args) { [#
// TODO 自动生成方法存根 y>'
Test t=new Test(); E01
// t.test1(); N
// t.test2(); t*g
// t.test3(); )2L
t.test4(); Q
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  d7N`W
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  mb
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  '
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  Wi
hibernate API(二): q
flush(): 从上面的例子可以看出,flush是刷新session的缓冲区,并执行里面的命令 YiR3
flush()的事务管理模式: flushMode()里面有三个常量,可以用数字来表示 9M6H
Load(): 另一种读取数据的方法,和get的区别是: 1.异常处理: load有异常处理,get没有,它返回null,2.get从数据库读数据,load可能去读缓冲区 3
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  ^j
事务的隔离级别: nb3g%N
在hibernate的数据库配置文件中设置 i
数字1为可以脏读,数字2为不能,这个是最常用的 !J
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  .$H[
锁机制: `xe)kL
避免并发冲突,在数据库中写数据是自动加锁的,读一般不加,有悲观锁和乐观锁 _3F
乐观锁是可以是hibernate程序自己加 mYt
实现乐观锁: 引例(hbn2包) QqH
步骤: p~ZQ>C
1. 在表中加个version字段 lA
2. 在持久类里加个version属性 $wi
3. 配置文件<version name=”versopm”> 每存一次值加1 ?|W:x
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  aL
引例:hbn2包 f(7i
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  }!^oL+
复杂的映射: e7].2n
1. 基数关系映射 -:~Loz
2. 继承关系映射 x2xOt
3. 组件关系映射 W|>O
4. 集合映射 9;p
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  f
基数关系的映射—one to one: q)-/"
基数关系的映射需要考虑的问题: [$Y
1. 数量问题 "D
2. 方向问题 w)K
在one to one的关系中,我们有两种方法可以体现类与类之间的关系 x2F
1. 共享主键 {d
2. 外键唯一 i4?
引例: Joto包-此包引用了fristHbn包 &
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  r4 A
建立与Fruit类有一对一关系的类: H
我们认为一个花有一个产地,一个产地生产一种花,所以要建立产地类 i1O}U9
package Yuchen.Joto.business.entity; 9^X=
//花的地址类 'j6
//问题:为什么不能在构造函数中写Fruit?因为生成对象后要持久化 G~W}?
//这个对象,但是数据库的表中不能插入另一个类的值,写上null又不
//大合适,所以就去掉它 'O-N
public class Address { ~C
private Integer aid; #B~Kh
private String nation; J
private String postcode; LThj.
private Fruit fruit; v#
public Address() { p
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  -
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  +&bG^U
public Address(String nation, String postcode) { /
super(); ,(RI
this.nation = nation; SUN,1c
this.postcode = postcode; Tz41z>
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  qz9:O
public Integer getAid() { ;
return aid; HG:0/
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  -%
public void setAid(Integer aid) { p[zZ7
this.aid = aid; 4A
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  ?Y.Q
public Fruit getFruit() { TBf
return fruit; )k>
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  fHK$u
public void setFruit(Fruit fruit) { {
this.fruit = fruit; =>
// fruit.setAddress(this); f7}
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  @Zu:.
public String getNation() { /z2T(P
return nation; $hB_i%
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  o
public void setNation(String nation) { wh_
this.nation = nation; N_D
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  j
public String getPostcode() { s
return postcode; m?uoXW
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  6we
public void setPostcode(String postcode) { M3#R
this.postcode = postcode; ^UP+
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  .
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  k
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  33I5
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  AFy
修改Fruit类: j)zF9
package Yuchen.Joto.business.entity; :Am<
//持久化类(花类),注意因为采用的是hilo的方式获得id,所以需要有setid的方法 )&A1
public class Fruit { OO
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  _^/
private Integer fid;//hibernate中的id不能识别int K8
private String name; qmL
private String comments; O
private int price; ,buVKT
private Address address;//一朵花对应一个地址 ,
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  *jy>u_
public Fruit() { OK
super(); <
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  ^M
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  fe@Ih
public Fruit(String name, String comments, int price) { Kk
super(); _p6
this.name = name; BAX)~4
this.comments = comments; {d$DcA
this.price = price; !
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  "|m
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  iMm
public Address getAddress() { Ga@em
return address; W6~P
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  3<
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  BE
public void setAddress(Address address) { @~$e*A
this.address = address; p
address.setFruit(this);//因为当你给一个花设置产地的时候 y77?
//该产地也有了花 pg8c';
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  >hD"s^
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  ixj']$
public String getComments() { =93Fs
return comments; V7
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  S
public void setComments(String comments) {
this.comments = comments; 8sk
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  6U<
©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  C
public Integer getFid() { 5U.
return fid; (e%M&
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  1uxT*}
public String getName() { -8>(~m
return name; MRKoQ
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  %`{
public void setName(String name) { <8%q
this.name = name; ,{b"1
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  z Be
public int getPrice() { -[f~&
return price; "
} ©达内IT技术论坛—中国人学Java、学C++、学C#/.Net、学软件、学IT的地方 -- 达内科技论坛  "(q
public void setPrice(int price) Z0
<script type="text/javascript">var _old131=CArea131.innerHTML;ConFONT('131','http://bbs.tarena.com.cn/non-cgi','1');</script>
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值