




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1. Java对象持久化概述 1.1. 应用程序的分层体系结构 1.1.1. 基于B/S的典型三层架构 展现层/表示层 1 r 业务逻辑层 1 F 数据访 问层 数据库 说明: 1,展现层:提供与用户交互的界面。 2,业务逻辑层:实现各种业务逻辑。 3,数据访问层:负责存放和管理应用程序的持久化业务数据。 1.1.2. 数据访问层与 Hibernate 在Java应用程序中的 角色 API。 数据访问层(持久化层)封装了数据访问的细节,为业务逻辑层提供了面向对象的 完善的持久化层应该达到的目标: 1,代码重用性高,可完成所有的数据访问操作。 2,如果需要的话,能够支持多种数据库平台。 3,具有
2、相对独立性,当持久化层变化时,不会影响上层实现。 在数据访问层(持久化层)中可以使用 Hibernate框架以实现要求,如下图所示: 鹘唏磚辭虧郴关叫 应用1 业务谴辑层 应用2 业筹逻辑层 应用3 业务逻辑层 持久化层 (hibEniEtE 1W2: MW3 持久化层封装了數据访问的字呻,为业芻騎层提無了面同对陳的阳匚完善的曲吹化层应邀 达到的目标; L代码重用性高可就所有的数据访问操作. 色如果需要篦话龍毎左转麴数据犀平台 um 1.2. 软件模型 1.2.1. 各种模型的说明 概念模型: 模拟问题域中的真实实体。描述每个实体的概念和属性及实体间关系。不描述实体行为。 实体间的关系有一对一
3、、一对多和多对多。 。 客户 厂订单 Name 1可 rderNumber age price 关系数据模型: 在概念模型的基础上建立起来的,用于描述这些关系数据的静态结构。有以下内容组成: i,若干表 2,表的所有索引 3,视图 4,触发器 5,表与表之间的参照完整性 域模型: 在软件的分析阶段创建概念模型,在软件设计阶段创建域模型。 组成部分: 1,具有状态和行为的域对象。 2,域对象之间的关联。 域对象(domain object): 构成域模型的基本元素就是域对象。对真实世界的实体的软件抽象,也叫做业务对象 (Business Object , B0)。域对象可代表业务领域中的人、地点
4、、事物或概念。 域对象分为以下几种: 1,实体域对象:通常是指业务领域中的名词。(plain old java object,简单Java 对象)。 2,过程域对象:应用中的业务逻辑或流程。依赖于实体域对象,业务领域中的动词。如发 出订单、登陆等。 3,事件域对象:应用中的一些事件(警告、异常)。 1.2.2. 域对象间的关系 关联: 类间的引用关系。以属性定义的方式表现。 依赖: 类之间访问关系。无需定义成属性。在A中访问B中的方法或属性, 化B。 或者 A负责实例 ptiblic void t () Cuttomeir Cnew CustcjineE(); c- et ) Person t
5、ianci5:et Hand 般化(Generalization ): 类之间继承关系。 123. 域对象的持久化概念 实体域对象在内存中创建后, 不能永久存在。将实体域对象永久保存起来, 就是持久化 的过程。通常只有实体域对象需要持久化, 过程域对象和事件域对象一般不需要持久化。 广 义持久化指增、删、改、查。 1.3. ORM与 ORM框架 1.3.1. ORM( Object/Relation Mapping) 对象关系映射(Object Relational Mapping ,简称ORM)是一种为了解决面向对 象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象
6、和数 据库之间映射的元数据,将 java程序中的对象自动持久化到关系数据库中。 ORM主要解决对象-关系的映射 面向对象概念 面向关系概念 类 表 对象 表的行(记录) 属性 表的列(字段) ORM的实现思想: 将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库 的操作转化为对对象的操作。因此ORM的目的是为了方便开发人员以面向对象的思想来实 现对数据库的操作。 ORM采用元数据来描述对象-关系映射细节 元数据通常采用XML格式,并且存放在专门的对象-关系映射文件中。 业畀逻辑层 域模型 (对象、属性.关联、继承和冬态) 持艾化层 ORMAPI 对象关至映肘文件 OR
7、M实现 参照 k (7ML) 数据库层 关系数据模型 (表*孚段*索引*主讎和外攏 ORM中间件的使用方法 采用元数据来描述对象-关系映射细节,元数据通常采用xml格式,并存放在专门的对 象-关系映射文件中。只要配置了持久化类与表的映射关系,orm中间件在运行时就能够参 照映射文件的信息,把域对象持久化到数据库中。例( Hibernate ): public void saveCustomer(Customer c) getSessi on( ).save(c); 执行步骤如下: 1. 运用反射机制,获得 Customer对象的Customer.class类。 2. 参照映射文件得到 Cust
8、omer类对应的表的信息,以及和Customer类关联的类以及 相应的表信息。 3. 根据以上信息生成 SQL语句。 4. 调用hibernate API,执行该语句。 1.3.2. 流行的ORM框架 Hibernate: 非常优秀、成熟的 ORM框架。提供强大的对象和关系数据库映射以及查询功能。 Hibernate是面向对象的程序设计语言和关系型数据库之间的桥梁,允许开发者采用面向 对象的方式来操作关系数据库。 Hibernate的目标是释放开发者通常的与数据库持久化相关的编程任务的95%。消 除那些针对特定数据库厂商的 SQL代码。 运行速度快。开发速度慢,不支持纯粹的面向对象操作, sq
9、l语句优化功能。 Ibatis 相比Hibernate灵活高, 需熟悉sql语句,并且熟练使用 TopL ink OJB 133. Hibernate 与Jdbc 代码对比 pvJjLLc voidneswge m) ( SC33.3S.V4 (tn); HLberaate 实现 pvkLic void, save (Connecrti onMessage jo ( PuepaedSttemrit ps = jihI 1 - SttinffVfli 1U45 7t 7 try ( ps = ccnn. prepareStateHten匸(sqL); pa.setstring(1, m.gerT
10、itle0); p专.setscring(2F m.getConrenu(); ps. xecutet): I cat oh. (SOLExcept.ion ej e.pr intStackTface(); Ifinaly( It (p3! JltllL) try :.hbm.xml Database 3.创建 Hibernate 配 置文什 23 第一个 Hibernate 程序(HelloWorld ) 231. 创建Eclipse工程并引入相关的jar 包 新建Java工程,并添加如下jar包: 1, hibernate_home/hibernate3.jar 2, hibernate_
11、home/lib/required/*.jar 3 , hibernate_home/lib/jpa/hibernate-jpa-2.0-api-1.0.0.Final.jar 4 ,数据库对应的 JDBC 驱动(例如 mysql-co nn ector-java-5.1.5-b in .jar 还可以加入日志相关的jar包(不加也可以) 1, log4j-1.2.15.jar 2,Slf4j-log4j12-1.6.1.jar 2.3.2. 创建持久化对象:User 2.3.3. 创建对象-关系映射文件:User.hbm.xml Customer 类属 性 Java类型 Hibernate
12、类 型 Cutomers字段名 Sql类型 Name java.la ng.Stri ng stri ng NAME Varchar(12) age int int age INT Sex char character SEX CHAR(1) Married boolea n boolea n married bit Des java.la ng.Stri ng text des CLOB Pic byte binary pic BLOB Birthday java.sql.Date date BIRTHDAY DATE registeredTime java.sql.TimeStamp ti
13、mestamp REGISTERED TIME TIMESTAMP 2.3.4. 仓【J建 Hibernate配置文件 hibernate.cfg.xml 创建表、JavaBean 、写映射文件 dialect 措定鹼確瘗的方言.虽感罟神教誌澤槨爸會标鹉,恒 不冋餡皴裁库昕丈理的-语屯脂有不冃.业朋iff販廳摩 购芳言.应:根备断弟用蝕越库的不冋设覽不目的拧言無.M 0 jiu 1 rg Ji i be mate. dl a le ct .Ora c ID i al e ct /针对 Oracle? cipg.hibernate.diiiiectfvlySCiLDialect ( fef 14
14、 MySd_ org hi be rnatv.dials ct S Q l-BmwarCiimlECtf ttSf 叵 CJl S 2 , Xml 文件(hibernate.cfg. xml ) a) 加载默认名称的配置文件(hibernate.cfg.xml) Con figuratio n cfg = new Con figurati on( ).c on figure(); b) 或加载指定名称的配置文件: Con figuratio n cfg = new Con figurati on() .configure(“ myhibernate.cfg.xml” ); 3.2. Sessi
15、onFactory Configuration对象根据当前的配置信息生成SessionFactory对象。 Sessio nFactory对象一旦构造完毕,即被赋予特定的配置信息(Sessio nFactory对 象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时, 相关代码如下: SessionFactory还负责维护Hibernate的二级缓存)。 Con figurati on cfg = new Con figurati on( ).c on figure(); Sessi onF actory sessi onF actory = cfg.buildSessi
16、onF actory(); 1, SessionFactory是线程安全的。 2, SessionFactory 是生成 Session 的工厂: Sessi on sessi on = sessi onF actory.ope nSessi on(); 3,构造SessionFactory很消耗资源,一般情况下一个应用中只初始化一个 Sessi onFactory 对象。 3.3. Session Sessi on是应用程序与数据库之间交互操作的一个单线程对象,是Hibernate 运 作的中心,所有持久化对象必须在session的管理下才可以进行持久化操作。此对象的 生命周期很短。Sess
17、ion中有一个缓存,显式执行flush()方法之前,所有的持久层操 作的数据都缓存在sessio n对象处。(相当于JDBC中的Conn ection) HibernateJDBC Database Database 持久化类与Session关联起来后就具有了持久化的能力。 Session是线程不安全的 Session 类的一些方法: 取得持久化对象的方法:get() load() 持久化对象都得保存, 更新和删除: save(),update(),saveOrUpdate(),delete() 开启事务:beginTransaction(). 管理 Session 的方法:isOpen(),
18、flush(),clear(), evict(), close() 等 3.4. Transaction 代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使 是只读操作。 代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行, 即使是只读操作。 Tran sact ion tx = sessi on .begi nTran sact ion(); 常用方法: commit():提交相关联的 sessio n实例 rollback():撤销事务操作 wasCommitted():检查事务是否提交 3.5. Query 和 Criteria 接口
19、 都是查询接口, Query实例包装了 HQL查询语句,hql是面向对象的,他引用类名及 类的属性名,而不是表名和字段名。Criteria接口完全封装了基于字符串形式的查询语句, 比Query接口更面向对象,他擅长执行动态查询。 3.6. Hibernate 的运行过程 Hibernate的运行过程如下: 1、 应用程序先调用Configuration类,该类读取Hibernate配置文件及映射文件中的 信息, 2、 并用这些信息生成一个SessionFactory对象, 3、 然后从SessionFactory对象生成一个 Session 对象, 4、 并用Session 对象生成 Tran
20、saction对象; A 、可通过Sessio n 对象的 get(),load(),save(),update(),delete()和 saveOrUpdate()等方法对PO进行加载、保存、更新、删除、等操作; B 、在查询的情况下,可通过 Session对象生成一个 Query对象,然后利用 Query 对象执行查询操作;如果没有异常, Tran sacti on对象将提交这些操作到数据库中。 4. 对象/关系数据库映射(一)基础 4.1. 持久化对象与 OID 4.1.1. 对持久化对象的要求 1. 提供一个无参的构造器。使Hibernate可以使用 Constructor.newln
21、stance() 来实例化持久化类。 2. 提供一个标识属性(identifierproperty )。通常映射为数据库表的主键字段。如 果没有该属性,一些功能将不起作用,如:Sessio n. saveOrUpdate()。 3. 为类的持久化类的字段声明访问方法(get/set )。Hibernate 对JavaBeans 风格 的属性实行持久化。 4. 使用非final类。在运行时生成代理对象是Hibernate的一个重要的功能。如果持 久化类没有实现任何接口,Hibnernate使用CGLIB 生成代理。如果使用的是 final类,则无法生成 CGLIB代理。 5. 重写eqauls(
22、) 和hashCode()方法。如果需要把持久化类的实例放到Set中(当需 要进行关联映射时),则应该重写这两个方法。 4.1.2. OID 为了在系统中能够找到所需对象,需要为每一个对象分配一个唯一的标识号。在关系数 据库中称之为主键,而在对象术语中,则叫做对象标识(Object iden tifier-OID)。 4.2. 对象/关系数据库映射文件(hbm.xml ) Hibernate 采用XML格式的文件来指定对象和关系数据之间的映射。在运行时 Hibernate将根据这个映射文件来生成各种SQL语句 映射文件的扩展名为“ .hbm.xml” 。 映射文件示例: 指定持夬f匕莞的OID
23、 和“表的主犍祐映酣 petty nawe-c?t ejs CPF type-WStjrjJisr / c/class :吐騎类的属性和表的字段 I y 指定对彖标识将生股器,负员 为OID生成咔一标识荐 43持久化类的属性及属性映射(普通属性) 映射配置示例 vproperty n ame= ” user name ” type= ” stri ng ” len gth= ” 64” / 4.3.1. 持久化类的属性及访问方法 Hibernate中持久化类的访问者有两个: 1, Java应用程序 2, hibernate (何时调用get、set方法?如下图所示) CKtnlion B 0
24、*? DOCTTFE hibemate-ei.pp 1 ng PUBLIC pr-/Hidernae/H1Cei:nate Happ:ng DID S.DZ/EK11 FFhti:p /hibernate B sour Mlorge. Mc/hibernwe-rjapplng-S 指建类和表的映射 c ls s aeupe- * ox * a 12 ei e - Jtd 上心左盈攻!t e * tstble- *NWS TWSLE generator class-Sira*/ 432. 使用基本数据类型和包装类型的区别 基本数据类型和包装类型对应的hibernate映射类型相同(映射是一样的)
25、,例: vproperty name=“ price ” type= “ double ” column=“ PRICE ” / 基本类型可直接运算、无法表达null、数字类型的默认值为0。 包装类默认值是null。当对于默认值有业务意义的时候需要使用包装类 例如:Student类有一个int类型的scope属性,表示学生的考试分数.int类型的scope属性无法表 达这样的业务需求: *如果scope的属性为null,表示该学生的成绩是未知的,有可能得了 100分,也有可能得了 0 分,只是暂时还不知道成绩 *如果scope属性为0,表示学生考试成绩为0分. *在上面的情况中必须使用包装类型
26、 4.3.3. Hibernate访问持久化类属性的策略 propertye (默认值): 表明hibernate通过getXXX和setXXX 来访冋类属性。推存使用。提咼域模型透 明性。 field hiber nate 通过java 反射机制直接访问类属性。对于没有get与set方法的属性 可设置该访问策略。 noop 它映射Java持久化类中不存在的属性,即主要用于HQL (用query 接口测试,使用 hql语句)中,当数据库中有某列,而实体中不存在的情况。 示例: vproperty n ame=n ame colu mn=n ame type=stri ng/ vproperty
27、 n ame=n ame colu mn=n ametype=stri ngaccess=no op/ 在持久化类的方法中加入程序逻辑 在Customer.hbm.xml文件中无需映射 first name和last name属性,而是映射 name属性 尽管类中并没有name属性,由于hibernate 不是直接访问Name属性,而是调用 get、set方法,因此建立了 First name 、Last name 和表之间的联系。 puJbXc: ci. a a* OLka-taniEA: l t 3* 丄竝亡色蝕JLClj ir I Virii 电 r St:i-直G勺 IFd rstrh
28、Aiiup) I?r i. va ft- s S tci.iin.fl X-a-rF# mamn ; puiiXJL c :StMJLn甘 甘日t, L 12 t. U.L IBi 11. L - Lri43 fflC* * * 1 fl *(114 HMT ; puli J i c? vol rl wwtJr-amfTHiim.*) jl (nawus-nixLlta * private Double totalprice;/f3SS中没有对应的列 在 Customer.hbmml 中増加 iflTE r customer 注意:在旳睛旬中使用别容潦生届桎忑用的是艸语旬 false 女口果指
29、定了 formula 属性,则就会 insert=false” update= 435. 控制 insert 、update 语句 映射属性 作用 vproperty的 右为false ,在insert语句中不包含该字段,该字段永远不能被 in sert属性 插入。默认值true 。 vproperty的 右为false , update 语句不包含该字段,该字段永远不能被更新。 update 属性 默认值为true 。 的 右为false,等价于所有的vproperty兀素的update 属性为 mutable 属性 false,整个实例不能被更新。默认为true 。 的 右为true ,等
30、价于所有的 vproperty兀素的insert为true , dyn amic-i nsert 保存一个对象时,动态生成in sert语句,语句中仅包含取值不为 属性 null的字段。默认false 。 的 右为true ,等价于所有的 vproperty兀素的update 为true , dyn amic-update 更新一个对象时,动态生成update语句,语句中仅包含取值不为 属性 null的字段。默认false 。 4.36 处理sql引用表示符 在SQL语法中,表示符是指用于为数据库表、视图、字段或索引等名字的字符串,常 规表示符不包括空格,也不包含特殊字符,因此无需使用引用符号
31、。如果数据库表名或列名 包含特殊字符,可以使用引用表示符(键盘下面的字符)。 类中增加: private String desc; 映射文件增加: vproperty name=desc column=desc “ type=text/ 4.3.7. 设置类的包名 如果在一个映射文件中包含多个类,并且这些类位于同一个包中,可以设置 vhibernate-mapping 元素的package 属性,以避免为每个类提供完整的类名。 指定类的全限定名 /geiieuatar class3 increment.11 / property name= birthday * cclunm1 kirthda
32、y1 type- date* /: 在 元素的指定package,就只需指定简单类名了 Jhiberna te-mappjLng package 11 cii itoast .EqlH -dass tiamE Cusl-oncx talaLc11 cnuist omeiz (Laiy= falser property name name co1umii= name type=, string / vpTnfnevhy nflnw age nnl iiwin= acjR1 typfi=, infrftfjRr / property nime= birthday- cclumn=l ljirthd
33、ay tyie date1 / .puojjerty nime= marbled1 column - married* type hcolean1 /j -.property nemE= pic coLumi= pi_C1 type= binary / property name des c?oumn=11 customEr des type= text1 /: 44映射对象标识符(OID,对应数据库主键) 441. OID,唯一性的标志 关系数据库用主键区分是否是同一条记录。 OID Hibernate 使用OID来建立内存中的对象和数据库中记录的对应关系。对象的 和数据库的表的主键对应。为
34、保证 OID的唯一性,应该让 Hibernate 来为OID赋值 主键必备条件: 1,不能为null 。 2,唯一,不能重复。 3,永远不会改变。 4.42自然主键和代理主键 自然主键:把具有业务含义的字段作为主键叫做自然主键。 代理主键:不具备业务含义的字段,该字段一般取名为“ id ”。(推荐) 在关系教据库鏈中,用戈程來识別记量井保运毎離込尿的惟-性,牡为上谨的宜段必 杯祸足以F塞件: 不允许为nulb 每集记隶真有惟一的鼻詹值.不允眸丰键1W晴复亠 毎条记录的主破竹永远不会改雙。 ft CUSTOMERS 中、如果州NAME字段作为主櫃,能提冬件是; 那条记录的客户姓名不允许为nulL
35、 不允许客户輩名 才允许旌改客户姓名. NAME字段足具有业务含义的宇段.把这种子段件为丄犍称为自然上键尽俾也是 可占的但JE不龍欄足可悅的业务礴拓一旦出期丁尤许客产畫名时业势話求,就必 弓幡攻数需蟆螫.匝新定义衷的主軽这皓敷抓南的堆护堆加了准廈。 1轉此更件理的丹式址怏弋理生即平鎂鶴业好告玄的守仪. 述孕段二 腔取彰为 ID 代農宅爐通书为蔡數类幸*因为桎邀类型比字符毕换刪婴节冇鰹桔約敕撫炖;今同由 11么代理审锤的伯从何而来躍F许雰嫩撇咋乘續都拇供了 F1励粧底吒葺壮键忙曲机制. 4.4.3. 数据库中的主键介绍 关系数据库按主键区分不同记录 把主键定义为自动增长类型 在my SQL中,把
36、字段设为 auto_increment类型,数据库会自动为主键赋值。 在ms SQL server中,把字段设为identity类型,数据库会自动为主键赋值。 oracle 从序列(sequenee)中获取自动增长的描述符 create seque nee seq_customer in creme nt by 2 start with 1 insert into customers values(seq_customer.curval,.) 4.4.4. java 与Hibernate如何区分对象 Java语言按内存地址(=)或equals()方法区分不同的对象 Hibernate中用对象表
37、示符(OID)来区分对象 OID是关系数据库中的主键在java对象模型中的等价物。在运行时,hibernate 据OID来维持java对象和数据库记录的对应关系。 Hibernate 使用 OID来区分对象,不是equals。方法!所以不重写持久化类的 hashCode() 与equals() 方法Hibernate也可以正确运行(但要放到HashSet 等集合 中时要注意需要重写这两个方法)。 445.ID和generator元素配置说明 配置示例: id name= “id ” type= long ” column= ID” 元素说明: 设定持久化类的 OID 和表的主键的映射,可以有以
38、下属性: name:标识持久化类OID的属性名 column:设置标识属性所映射的数据列的列名(主键字段的名字). unsaved-value:若设定了该属性,Hibernate 和该属性值来区分当前持久化类的对象是否为临时对象 会通过比较持久化类的OID 值 ,在Hibernate3中几乎不 type: 指定 Hibernate映射类型.Hibernate 类型的桥梁.如果没有为某个属性显式设定映射类型 映射类型是Java 类型与SQL 会运用反射机 ,Hibernate 制先识别出持久化类的特定属性的Java 类型, 然后自动使用与之对应的默认的 Hibernate映射类型 Java 的基
39、本数据类型和包装类型对应相同的 类型无法表达n ull,所以对于持久化类的 Hibernate 映射类型.基本数据 OID推荐使用包装类型 ge nerator元素说明 class 属性: 设定持久化类设定标识符生成器,可以有一个 class:指定使用的标识符生成器全限定类名或其缩写名。 元素的class属性可以指定的值说明(主键生成策略) 主键生成器 描述 in creme nt 适用于代理主键。由hibernate自动以递增的方式生成表识符,每次增 里为1。 ide ntity 适用于代理主键。由底层数据库生成表识符。条件是数据库支持自动增长 数据类型。 sequenee 适用于代理主键。
40、Hibernate根据底层数据库序列生成标识符。条件是数 据库支持序列。 hilo 适用于代理主键。Hibernate根据hign/low算法生成标识符。 Hibernate把特定表的字段作为“ hign ”值。默认情况下,采用 hibernate_unique_key表的 next_hi 字段。 n ative 适用于代理主键。根据底层数据库对自动生成表示符的能力来选择 identity、sequenee 、hilo uuid.hex 适用于代理主键。Hibernate采用128位的UUID算法来生成标识符。 该算法能够在网络环境中生成唯一的字符串标识符,这种策略并不流行, 因为字符串类型的
41、主键比整数类型的主键占用更多的数据库空间。 assig ned 适用于自然主键。由java程序负责生成标识符。不能把setID() 方法声 明为private的。尽量避免使用自然主键。 445.1. in creme nt id nantaid ealumn*B idH in creme nt标识符生成器由Hibernate以递增的方式为代理主键赋值 Hibernate会先读取表中的主键的最大值,向表中插入记录时,就在max(id) 的基 础上递增,增量为1。 适用范围: 1,由于in creme nt生存标识符机制不依赖于底层数据库系统,因此它适合所有的 数据库系统。 2,适用于只有单个Hi
42、bernate应用进程访问同一个数据库的场合,在多线程情况 下会有问题。 3, OID必须为long、int或short 类型,如果把OID定义为byte 类型,在运行 时会抛出异常 . ide ntity or eldss11 itirntit-y11 / iden tity标识符生成器由底层数据库来负责生成标识符,它要求底层数据库把主键 定义为自动增长字段类型。 适用范围: 1,由于identity生成标识符的机制依赖于底层数据库系统,因此,要求底层数据 库系统必须支持自动增长字段类型。支持自动增长字段类型的数据库包括:DB2、 Mysql、MSSQLServer、Sybas
43、e 等。 2, OID必须为Io ng, i nt或short 类型,如果把OID 定义为byte 类型, 在运行时会抛出异常。 4453seque nee id nffline* 0询8仏3汕可的幺哦 seque nee标识符生成器利用底层数据库提供的序列来生成标识符 Hibernate 在持久化一个 News对象时,先从底层数据库的news_seq序列中获 得一个唯一的标识号,再把它作为主键值 适用范围: 1,由于sequenee生成标识符的机制依赖于底层数据库系统的序列,因此,要求底 层数据库系统必须支持序列。支持序列的数据库包括:DB2 Oracle 等。 2, OID必须为Io ng
44、, i nt或short 类型,如果把OID 定义为byte 类型, 在运行时会抛出异常。 4454 hilo hilo标识符生成器由 Hibernate 按照一种high/low 算法*生成标识符,它从数 据库的特定表的字段中获取high 值. Hibernate在持久化一个 News对象时,由Hibernate负责生成主键值 .hilo 标识符生成器在生成标识符时,需要读取并修改HI_TABLE 表中的NEXT_VALUE 值. 适用范围: 1,由于hilo生存标识符机制不依赖于底层数据库系统,因此它适合所有的数据库 系统 2, OID必须为Io ng,i nt或short 类型,如果把O
45、ID 定义为byte 类型, 在运行时会抛出异常 445.5. n ative native标识符生成器依据底层数据库对自动生成标识符的支持能力,来选择使用 identity, sequenee或 hilo 标识符生成器. 适用范围: 1,由于native能根据底层数据库系统的类型,自动选择合适的标识符生成器, 因此很适合于跨数据库平台开发 2, OID必须为Io ng, i nt或short 类型,如果把OID 定义为byte 类型, 在运行时会抛出异常 4456assig ned assig ned表示手工指定主键的值。 .1. 映射单个自然主键 假如CUSTOME貼叢没有宦
46、义1D代理上仏 而擅以NAMF字段昨力主仏 那么相应 也 4. Customer 必定义id Customer类的OID為name属ft它朗映财狀码 如下! 445.62映射复合主键(方法一) pvhlic cJ_a.ss CustomeT: unlemnts java.io I pl!iv ate String f irstname ; juivat l)xiv String des ; ccLjsk ndmf=Custoonexncustomerl*2y= false coiKniosit#d :JiEhy-tnoperty n | | 38试保存| Tcs t jouiilic void
47、 incertCustonier () f Session sessi-OTtsss-LanF七o上-up色nSS电罢岳ion ( ; Transaction txsession.beginTrejisaction(); Customer e=new CustomerO ; c * stFirstn ame (张11; c. se tLJStJiame): session, sve (c);保存对象 tx - crnimit ();“缶务提交 sessi an. .cl.理它();/Pilwess; ton .3. 映射复合主键(方法二) public c private Sti
48、iny lastnama ; public ol-ase Customer implem-ent s j. o . Seir3-al=Lzal)Xc private Custodnerld cust-nmErld; I private Stiiik key pxopexty Rdnc*firfftnamecolumn fixstnhe type- rtzing / qiropei! ty aajnje dea1 colunin1 cubt omer des lype*11 text * / / class- /hi h eTiiat e -mapp in 护 4.5. Hibernate映射类
49、型 4.5.1. 内置映射类型 内置映射类型 Hibernate java sql 取值范围 in teger int int In teger INTEGER 4 long long Long BIGINT 8 short short Short SMALLINT 2 byte byte Byte TINYINT 1 float float Float FLOAT 4 double double Double DOUBLE 8 big decimal java.math.BigDeci ni mal NUMERIC 8位含2位小数部分 character char Character Str
50、i ng CHAR(1) 定长字符 stri ng Stri ng VARCHAR 变长串 boolea n boolea n Boolea n BIT 布尔 yes_no boolea n Boolea n CHAR(1) 布尔 true_false boolea n Boolea n CHAR(1) 布尔 4.5.2. java时间和日期类性 Hibernate java sql 取值范围 date util.Date sql.Date DATE YYYY-MM-DD time util.Date sql.Time TIME HH:MM:SS timestamp util.Date sql
51、.timestamp TIMESTAMP YYYYMMDDHHMMSS cale ndar java.util.Cale ndar TIMESTAMP YYYYMMDDHHMMSS cale ndar date java.util.Cale ndar DATE YYYY-MM-DD 4.5.3. 大对象类型的映射 Hibernate java sql binary byte VARBINARY(BLOB) text Stri ng CLOB serializable 实现类 BARBINARY(BLOB) clob sql.Clob CLOB blob sql.Blob BLOB 不允许以上类
52、型来定义OID 如果持久化类的字段为 blob或clob类型,保存时需要包含两步: Customer c = new Customer。; /现保存一个空的clob实例 c.setDescripti on( Hibern ate.createClob(); sessi on. save(c); sessi on. flush(); / 锁定记录 sessio n. refresh(customer,LockMode.UPGRADE); oracle.sql.CLOB clob = c.getDescripti on(); /写入大文本 java.io.Writer pw = clob.getC
53、haracterOutputStream(); pw.write(lo ngtext); pw.close(); mit(); sessi on. close(); (HibernateReference3.2.2中有)JDBC 类 java.sql.Clob和 java.sql.Blob的映射。某些程序可能不适合使用这个类型,因为blob 和clob 对象 可能在一个事务之外是无法重用的。(而且,驱动程序对这种类型的支持充满着补丁和前后 矛盾。) 4.5.4. JDK自带的个别java类的映射类型 Hibernate java sql class java .Ian g.Class VARC
54、HAR locale java.util.Locale VARCHAR timez one java.util.TimeZ one VARCHAR curre ncy java.util.Curre ncy VARCHAR 5. 对象/关系数据库映射(二) 5.1. 集合映射 集合属性大致有两种: Map结构的集合属性,每个属性值都有对应的Key映射 集合映射的元素大致有如下几种: list: 用于映射List集合属性 set: 用于映射Set集合属性 map: 用于映射Map集合性 array: 用于映射数组集合属性 bag: 用于映射无序集合 idbag: 用于映射无序集合,但为集合增加逻
55、辑次序 . Set 但Set是无序, 不可重复的集合。 0 :id : int a logrName : String lorPwd : String regDate ; Date .interests :String nerato壬 c 1 as 3= t i ve,r/ W4 puop Segs ion segs ion = sessionFactory.cpenSessicm Q ; Transact ion t x = 吕巳存die口幻住ginT匚旨口/曰匚匚ioii (); User user = new ITser (); user , setLoginKaihe (
56、rrTom,r): user . setlog inP wd ( ,f L3 3 4-5Sr,; user * scOegDace (nevr ?ave () J1 ; Ser interests = new HashSer t): interests . add ( rrt eadingtpi interests * add (n; user,set Interests(incerescs); se3sioTisave (user): tx .commit (): sessioiLtC Lose (); 生成的表及插入的数据 类型 空 dFKlDF用E旳ADD11DEA : personjd
57、 persond int user.PERSONID personid interest 1 readirg 1 gaming 注:映射Set 集合属性时,如果 element 元素包括not- null =“true ” 属性, 则集合属性表以关联持久化类的外键和元素列作为联合主键,否则该表没有主键。但List 集合属性不会,List集合属性总是以外键列和元素此序列作为联合主键。 5.1.12 List List是有序集合,因此持久化到数据库时必须增加一列来表示集合元素的次序。 集合属性只能以接口声明(当持久化某个实例时,Hibernate会自动把程序中的集合 实现类替换成 Hibernat
58、e 自己的集合实现类),因此下面代码中,schools的类型 能是List ,不能是 ArrayList, 映射说明 list元素要求用list- in dex的子元素来映射有序集合的次序列。 集合的属性的值会存放有另外的表中,须以外键关联,用Key元素来映射外键列。 当集合元素是基本数据类型及其包装类,字符串或日期类型时使用eleme nt来映射 集合属性 Pernin c d Hnt b nmrne :虫ring a igt i int sclvk ! List class nstt Transact.ion ex session.beginTransact-ion (); Person
59、person = uptf Person): person.se cAge( S); personse tNaine ( s iniplei*); Lis匸 schools = nnr ArrayLi3匸(); schools .add (,rYumin(jrr) * sehco Is .sdd (rr(Jin.g-iiia,r) personsetSchoc 1s(schools); seas ionsave(perscn| ; tii.; segs ionclose(); 生成的表及插入的数据 person 尖型 PERSON_ID uiiiqua PR5ON.It int(U) cr e
60、flwnt 刚L) name varcfh*r(3O) 弋空 PERSONJD nam# 1 tkrpMl 一 school 矣出 窒 vtua 至約i rHwnjdHschcwl_ndax Lrtque F7ZWM37I=ADED7L36 pefMnjd IjpffKXljd rt(in FW! _JL - tncsoi *char(3O) ys 0 Mtwd.rwfex M 左 FKZZ- person.PER5ON ID persQn_id school schodl_ndeK 0 1 Qiniua 1 5.1.13 数组 数组属性的映射和 List的处理方式基本一致 数组使用元素完成完
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高考数学实践2024年试题及答案
- 网络服务的级别试题及答案分析
- 企业竞争策略与风险分析试题及答案
- 2025年软考设计师备考情绪管理试题及答案
- 2025农民土地流转合同范本
- 2025企业租赁合同标准范文
- 棉业公司范本章程
- 法学概论研究的国际视野与试题与答案
- 班级获奖经验的总结与反思计划
- 组织文件档案的秘书工作计划
- 《平凡的世界》中孙少平人物形象分析8500字(论文)
- 《结构式家庭疗法提升“丧偶式育儿”家庭亲密度的个案研究》
- 化学实验室废物处理管理制度
- 2024年六西格玛黄带认证考试练习题库(含答案)
- 第三章-足球-基本技术 足球运球绕杆 教学设计 人教版初中体育与健康七年级全一册
- 2024年同等学力英语考试真题及详解
- 会展活动场地布置与搭建技术规范手册
- “非遗”之首-昆曲经典艺术欣赏智慧树知到期末考试答案章节答案2024年北京大学
- 《药事管理学》习题库
- 水文地质技术员技能鉴定理论考试题库-下(多选、判断题)
- DZ∕T 0054-2014 定向钻探技术规程(正式版)
评论
0/150
提交评论