




已阅读5页,还剩66页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
711. Java对象持久化概述1.1. 应用程序的分层体系结构1.1.1. 基于B/S的典型三层架构软件的层必须具备如下特征:1, 每个层由一组相关的类或组件构成, 共同完成特定的功能。2, 层与层之间存在自上而下的依赖关系,即上层组件访问下层组件的 API,而下层组件不应该依赖上层组件。展现层业务逻辑层数据访问层数据库说明:1, 展现层:提供与用户交互的界面。2, 业务逻辑层:实现各种业务逻辑。3, 数据访问层:负责存放和管理应用程序的持久化业务数据。1.1.2. 数据访问层与Hibernate在Java应用程序中的角色数据访问层(持久化层)封装了数据访问的细节,为业务逻辑层提供了面向对象的API。完善的持久化层应该达到的目标:1, 代码重用性高,可完成所有的数据访问操作。2, 如果需要的话,能够支持多种数据库平台。3, 具有相对独立性,当持久化层变化时,不会影响上层实现。在数据访问层(持久化层)中可以使用Hibernate框架以实现要求,如下图所示:1.2. 软件模型1.2.1. 各种模型的说明概念模型概念模型描述了每个实体的得概念和属性,以及实体之间的关系:一对一、一对多和多对多:模拟问题域中的真实实体。描述每个实体的概念和属性及实体间关系。不描述实体行为。实体间的关系有一对一、一对多和多对多。关系数据模型:在概念模型的基础上建立起来的,用于描述这些关系数据的静态结构。有以下内容组成:1, 若干表2, 表的所有索引3, 视图4, 触发器5, 表与表之间的参照完整性域模型:在软件的分析阶段创建概念模型,在软件设计阶段创建域模型。组成部分:1, 具有状态和行为的域对象。2, 域对象之间的关联。域对象(domain object):构成域模型的基本元素就是域对象。对真实世界的实体的软件抽象,也叫做业务对象(Business Object,BO)。域对象可代表业务领域中的人、地点、事物或概念。域对象分为以下几种:1, 实体域对象:通常是指业务领域中的名词。(plain old java object,简单Java对象)。2, 过程域对象:应用中的业务逻辑或流程。依赖于实体域对象,业务领域中的动词。如发出订单、登陆等。3, 事件域对象:应用中的一些事件(警告、异常)。1.2.2. 域对象间的关系关联关联是类之间的一种关系,例如老师教学生,老公和老婆等就是一种关系。这种关系是非常明显的,在问题领域中通过分析直接就能得出。:类间的引用关系。以属性定义的方式表现。依赖如果两个元素其中一个的定义发生改变则会引起另一个元素发生变化则称这两个元素之间存在依赖关系,对于类来说,依赖可能存在于下列几种情况中:一个类要发送消息给另一个类;一个类将另一个类作为其数据的一部分;一个类的操作中将另一个类作为其参数。:类之间访问关系。无需定义成属性。在A中访问B中的方法或属性,或者A负责实例化B。聚集(Aggregation):整体与部分的关系。例人与手的关系。部分类的对象不能单独存在,他的生命周期依赖于整体类的对象的生命周期,整体消失时,部分也随之消失。一般化(Generalization):类之间继承关系。1.2.3. 域对象(Domain)的持久化概念 实体域对象在内存中创建后,不能永久存在。将实体域对象永久保存起来,就是持久化的过程。通常只有实体域对象需要持久化,过程域对象和事件域对象一般不需要持久化。广义持久化指增、删、改、查。1.3. ORM与ORM框架1.3.1. ORM(Object/Relation Mapping) 对象关系映射(Object Relational Mapping,简称ORM)是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。 简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中。ORM 主要解决对象-关系的映射面向对象概念面向关系概念类表对象表的行(记录)属性表的列(字段)ORM的实现思想:将关系数据库中表中的记录映射成为对象,以对象的形式展现,程序员可以把对数据库的操作转化为对对象的操作。因此ORM的目的是为了方便开发人员以面向对象的思想来实现对数据库的操作。ORM 采用元数据来描述对象-关系映射细节元数据通常采用 XML 格式,并且存放在专门的对象-关系映射文件中。ORM中间件的使用方法采用元数据来描述对象-关系映射细节,元数据通常采用xml格式,并存放在专门的对象-关系映射文件中。只要配置了持久化类与表的映射关系,orm中间件在运行时就能够参照映射文件的信息,把域对象持久化到数据库中。例(Hibernate):public void saveCustomer(Customer c) getSession().save(c);执行步骤如下:1.运用反射机制,获得Customer对象的Customer.class类。2.参照映射文件得到Customer类对应的表的信息,以及和Customer类关联的类以及 相应的表信息。3.根据以上信息生成SQL语句。4.调用hibernate API,执行该语句。1.3.2. 流行的ORM框架Hibernate:非常优秀、成熟的 ORM 框架。提供强大的对象和关系数据库映射以及查询功能。Hibernate是面向对象的程序设计语言和关系型数据库之间的桥梁,允许开发者采用面向对象的方式来操作关系数据库。Hibernate 的目标是释放开发者通常的与数据库持久化相关的编程任务的 95%。消除那些针对特定数据库厂商的SQL代码。Ibatis:相比 Hibernate 灵活高,运行速度快。开发速度慢,不支持纯粹的面向对象操作,需熟悉sql语句,并且熟练使用sql语句优化功能。TopLinkOJB1.3.3. Hibernate 与 Jdbc 代码对比1.4. 小结2. Hibernate入门(HelloWorld)2.1. Hibernate介绍Hibernate是一个基于jdbc的开源的持久化框架,是一个优秀的ORM实现,它很大程度的简化了dao层编码工作。Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。在分层结构中处于持久化层,封装对数据库的访问细节,使业务逻辑层更专注于实现业务逻辑。Hibernate的主页为:/Hibernate的下载地址:/projects/hibernate/files/hibernate3/HibernateTools的下载地址:/projects/jboss/files/JBossTools/JBossTools3.1.x/HibernateTools-3.3.1.v201006011046R-H111-GA.zip/download 2.2. Hibernate的体系结构与开发步骤Hibernate的体系结构Hibernate开发步骤2.3. 第一个Hibernate程序(HelloWorld)2.3.1. 创建Eclipse工程并引入相关的jar包新建Java工程,并添加如下jar包:1,hibernate_home/ hibernate3.jar2,hibernate_home/lib/required/*.jar3,hibernate_home/lib/jpa/hibernate-jpa-2.0-api-1.0.0.Final.jar如果不加此包,会有异常:java.lang.ClassNotFoundException: javax.persistence.EntityListeners4, 数据库对应的JDBC驱动(例如mysql-connector-java-5.1.5-bin.jar)还可以加入日志相关的jar包(不加也可以):1, log4j-1.2.15.jar2, slf4j-log4j12-1.6.1.jar2.3.2. 创建持久化对象:User2.3.3. 创建对象-关系映射文件:User.hbm.xmlCustomer类属性Java类型Hibernate类型Cutomers字段名Sql类型Namejava.lang.StringstringNAMEVarchar(12)ageintintageINTSexcharcharacterSEXCHAR(1)MarriedbooleanbooleanmarriedbitDesjava.lang.StringtextdesCLOBPicbytebinarypicBLOBBirthdayjava.sql.DatedateBIRTHDAYDATEregisteredTimejava.sql.TimeStamptimestampREGISTERED_TIMETIMESTAMP2.3.4. 创建 Hibernate 配置文件:hibernate.cfg.xml创建表、JavaBean、写映射文件2.3.5. 通过 Hibernate API 编写访问数据库的代码编程步骤1, 获取 Configuration 对象。2, 获取 SessionFactory 对象。3, 获取 Session,打开事务。4, 用面向对象的方式操作数据库。5, 关闭事务,关闭 Session。增删改查功能的实现代码3. Hibernate API简介3.1. ConfigurationConfiguration 类负责管理 Hibernate 的配置信息包括如下内容:1,Hibernate运行的底层信息:数据库的URL、用户名、密码、JDBC驱动类,数据库Dialect,数据库连接池等(对应 hibernate.cfg.xml 文件)。2,持久化类与数据表的映射关系(*.hbm.xml 文件)。创建 Configuration 的两种方式1, 属性文件(perties)Configuration cfg = new Configuration();2, Xml文件(hibernate.cfg.xml)a) 加载默认名称的配置文件(hibernate.cfg.xml)Configuration cfg = new Configuration().configure();b) 或加载指定名称的配置文件:Configuration cfg = new Configuration() .configure(“myhibernate.cfg.xml”);3.2. SessionFactoryConfiguration对象根据当前的配置信息生成 SessionFactory 对象。SessionFactory 对象一旦构造完毕,即被赋予特定的配置信息(SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存)。 相关代码如下: Configuration cfg = new Configuration().configure(); SessionFactory sessionFactory = cfg.buildSessionFactory();1, SessionFactory是线程安全的。2, 构造 SessionFactory 很消耗资源,一般情况下一个应用中只初始化一个 SessionFactory 对象。3, SessionFactory是生成Session的工厂:Session session = sessionFactory.openSession();3.3. SessionSession 是应用程序与数据库之间交互操作的一个单线程对象,是 Hibernate 运作的中心,所有持久化对象必须在 session 的管理下才可以进行持久化操作。此对象的生命周期很短。Session 中有一个缓存,显式执行flush()方法之前,所有的持久层操作的数据都缓存在 session 对象处。(相当于 JDBC 中的 Connection)。一般一个业务操作使用一个Session。l 持久化类与 Session 关联起来后就具有了持久化的能力。l Session是线程不安全的,一般是一次业务操作使用一个Session。l Session 类的一些方法:取得持久化对象的方法: get() load()持久化对象都得保存,更新和删除:save(),update(),saveOrUpdate(),delete()开启事务: beginTransaction().管理 Session 的方法:isOpen(),flush(), clear(), evict(), close()等3.4. Transaction代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。 l 代表一次原子操作,它具有数据库事务的概念。所有持久层都应该在事务管理下进行,即使是只读操作。Transaction tx = session.beginTransaction();l 常用方法:commit():提交相关联的session实例rollback():撤销事务操作wasCommitted():检查事务是否提交3.5. Query和Criteria接口都是查询接口,Query实例包装了HQL查询语句,hql是面向对象的,它引用类名及类的属性名,而不是表名和字段名。Criteria(标准)接口完全封装了基于字符串形式的查询语句,比Query接口更面向对象,他擅长执行动态查询。3.6. Hibernate的运行过程Hibernate的运行过程如下:1、应用程序先调用Configuration类,该类读取Hibernate配置文件及映射文件中的信息,2、并用这些信息生成一个SessionFactory对象,3、然后从SessionFactory对象生成一个Session对象,4、并用Session对象生成Transaction对象; A、可通过Session对象的get(),load(),save(),update(),delete()和saveOrUpdate()等方法对PO进行加载、保存、更新、删除、等操作; B、在查询的情况下,可通过Session对象生成一个Query对象,然后利用Query对象执行查询操作;如果没有异常,Transaction对象将提交这些操作到数据库中。4. 对象/关系数据库映射(一)基础4.1. 持久化对象与OID4.1.1. 对持久化对象的要求1. 提供一个无参的构造器。使Hibernate可以使用Constructor.newInstance() 来实例化持久化类。2. 提供一个标识属性(identifier property)。通常映射为数据库表的主键字段。如果没有该属性,一些功能将不起作用,如:Session.saveOrUpdate()。3. 为类的持久化类的字段声明访问方法(get/set)。Hibernate对JavaBeans风格的属性实行持久化。4. 使用非final类。在运行时生成代理是Hibernate的一个重要的功能。如果持久化类没有实现任何接口,Hibnernate 使用 CGLIB 生成代理。如果使用的是 final 类,则无法生成CGLIB代理。5. 重写eqauls()和hashCode()方法。如果需要把持久化类的实例放到Set中(当需要进行关联映射时),则应该重写这两个方法。4.1.2. OID为了在系统中能够找到所需对象,需要为每一个对象分配一个唯一的标识号。在关系数据库中称之为主键,而在对象术语中,则叫做对象标识(Object identifier-OID)。4.2. 对象/关系数据库映射文件(hbm.xml)Hibernate 采用 XML 格式的文件来指定对象和关系数据之间的映射。在运行时 Hibernate 将根据这个映射文件来生成各种SQL语句映射文件的扩展名为“.hbm.xml”。映射文件示例:4.3. 持久化类的属性及属性映射(普通属性)映射配置示例4.3.1. 持久化类的属性及访问方法Hibernate中持久化类的访问者有两个:1, Java应用程序2, hibernate(何时调用get、set方法?如下图所示)4.3.2. 使用基本数据类型和包装类型的区别基本数据类型和包装类型对应的hibernate映射类型相同(映射是一样的),例:基本类型可直接运算、无法表达null、数字类型的默认值为0。包装类默认值是null。当对于默认值有业务意义的时候需要使用包装类。例如:Student类有一个int类型的scope属性,表示学生的考试分数.int类型的scope属性无法表达这样的业务需求: * 如果scope的属性为null,表示该学生的成绩是未知的,有可能得了100分,也有可能得了0分,只是暂时还不知道成绩 * 如果scope属性为0,表示学生考试成绩为0分. * 在上面的情况中必须使用包装类型4.3.3. Hibernate访问持久化类属性的策略propertye (默认值):表明hibernate通过getXXX和setXXX来访问类属性。推荐使用。提高域模型透明性。fieldhibernate通过java反射机制直接访问类属性。对于没有get与set方法的属性可设置该访问策略。noop它映射Java持久化类中不存在的属性,即主要用于HQL(用query接口测试,使用hql语句)中,当数据库中有某列,而实体中不存在的情况。示例:在持久化类的方法中加入程序逻辑在Customer.hbm.xml文件中无需映射firstname和lastname属性,而是映射name属性尽管类中并没有name属性,由于hibernate不是直接访问Name属性,而是调用get、set方法,因此建立了Firstname、Lastname和表之间的联系。4.3.4. 设置派生属性(formula)利用元素的formula属性,用来设置一个sql表达式,hibernate将根据它来计算出派生属性的值。如果指定了formula 属性,则就会insert=”false” update=”false”4.3.5. 控制insert、update语句映射属性作用的insert属性若为false,在insert语句中不包含该字段,该字段永远不能被插入。默认值true。的update属性若为false,update语句不包含该字段,该字段永远不能被更新。默认值为true。的mutable属性若为false,等价于所有的元素的update属性为false,整个实例不能被更新。默认为true。的dynamic-insert属性若为true,等价于所有的元素的insert为true,保存一个对象时,动态生成insert语句,语句中仅包含取值不为null的字段。默认false。的dynamic-update属性若为true,等价于所有的元素的update为true,更新一个对象时,动态生成update语句,语句中仅包含取值不为null的字段。默认false。4.3.6. 处理sql引用表示符在SQL语法中,表示符是指用于为数据库表、视图、字段或索引等名字的字符串,常规表示符不包括空格,也不包含特殊字符,因此无需使用引用符号。如果数据库表名或列名包含特殊字符,可以使用引用表示符(键盘下面的字符)。类中增加:private String desc;映射文件增加:4.3.7. 设置类的包名如果在一个映射文件中包含多个类,并且这些类位于同一个包中,可以设置元素的package属性,以避免为每个类提供完整的类名。指定类的全限定名在元素的指定package,就只需指定简单类名了4.4. 映射对象标识符(OID,对应数据库主键)4.4.1. OID,唯一性的标志为了在系统中能够找到所需对象,需要为每一个对象分配一个唯一的标识号。在关系数据库中称之为主键,而在对象术语中,则叫做对象标识(Object identifier-OID)。关系数据库用主键区分是否是同一条记录。Hibernate使用OID来建立内存中的对象和数据库中记录的对应关系。对象的OID和数据库的表的主键对应。为保证OID的唯一性,应该让Hibernate来为OID赋值。主键必备条件:1,不能为null。2,唯一,不能重复。3,永远不会改变。4.4.2. 自然主键和代理主键业务主键(自然主键):在数据库表中把具有业务逻辑含义的字段作为主键,称为“自然主键(Natural Key)”。逻辑主键(代理主键):在数据库表中采用一个与当前表中逻辑信息无关的字段作为其主键,称为“代理主键”。复合主键(联合主键):通过两个或者多个字段的组合作为主键。自然主键:把具有业务含义的字段作为主键叫做自然主键。代理主键:不具备业务含义的字段,该字段一般取名为“id”。(推荐)4.4.3. 数据库中的主键介绍关系数据库按主键区分不同记录把主键定义为自动增长类型在my SQL中,把字段设为auto_increment类型,数据库会自动为主键赋值。在ms SQL server中,把字段设为identity类型,数据库会自动为主键赋值。oracle从序列(sequence)中获取自动增长的描述符create sequence seq_customer increment by 2 start with 1insert into customers values(seq_customer.curval,.)4.4.4. java与Hibernate如何区分对象Java语言按内存地址(=)或equals()方法区分不同的对象Hibernate中用对象表示符(OID)来区分对象OID是关系数据库中的主键在java对象模型中的等价物。在运行时,hibernate根据OID来维持java对象和数据库记录的对应关系。Hibernate使用OID来区分对象,不是equals()方法!所以不重写持久化类的hashCode()与equals()方法Hibernate也可以正确运行(但要放到HashSet等集合中时要注意需要重写这两个方法)。4.4.5. ID和 generator元素配置说明配置示例: 元素说明:设定持久化类的 OID 和表的主键的映射,可以有以下属性: name: 标识持久化类 OID 的属性名 column: 设置标识属性所映射的数据列的列名(主键字段的名字). unsaved-value:若设定了该属性, Hibernate 会通过比较持久化类的 OID 值和该属性值来区分当前持久化类的对象是否为临时对象,在Hibernate3中几乎不再需要. type:指定 Hibernate 映射类型. Hibernate 映射类型是 Java 类型与 SQL 类型的桥梁. 如果没有为某个属性显式设定映射类型, Hibernate 会运用反射机制先识别出持久化类的特定属性的 Java 类型, 然后自动使用与之对应的默认的 Hibernate 映射类型 Java 的基本数据类型和包装类型对应相同的 Hibernate 映射类型. 基本数据类型无法表达 null, 所以对于持久化类的 OID 推荐使用包装类型元素说明设定持久化类设定标识符生成器,可以有一个class属性: class: 指定使用的标识符生成器全限定类名或其缩写名。元素的class属性可以指定的值说明(主键生成策略)主键生成器描述increment适用于代理主键。由hibernate自动以递增的方式生成标识符,每次增量为1。identity适用于代理主键。由底层数据库生成表识符。条件是数据库支持自动增长数据类型。sequence适用于代理主键。Hibernate根据底层数据库序列生成标识符。条件是数据库支持序列。hilo适用于代理主键。Hibernate根据hign/low算法生成标识符。Hibernate把特定表的字段作为“hign”值。默认情况下,采用hibernate_unique_key表的next_hi字段。native适用于代理主键。根据底层数据库对自动生成表示符的能力来选择identity、sequence、hilouuid适用于代理主键。Hibernate采用128位的UUID算法来生成标识符。该算法能够在网络环境中生成唯一的字符串标识符,这种策略并不流行,因为字符串类型的主键比整数类型的主键占用更多的数据库空间。assigned适用于自然主键。由java程序负责生成标识符。不能把setID()方法声明为private的。尽量避免使用自然主键。. increment l increment 标识符生成器由 Hibernate 以递增的方式为代理主键赋值l Hibernate 会先读取表中的主键的最大值,向表中插入记录时, 就在 max(id) 的基础上递增,增量为1。l 适用范围:1, 由于 increment生存标识符机制不依赖于底层数据库系统,因此它适合所有的数据库系统。2, 适用于只有单个 Hibernate 应用进程访问同一个数据库的场合,在多线程情况下会有问题。3, OID必须为long、int或 short 类型,如果把OID定义为byte类型,在运行时会抛出异常. identity l identity 标识符生成器由底层数据库来负责生成标识符, 它要求底层数据库把主键定义为自动增长字段类型。l 适用范围:1, 由于 identity 生成标识符的机制依赖于底层数据库系统,因此,要求底层数据库系统必须支持自动增长字段类型。支持自动增长字段类型的数据库包括:DB2、 Mysql、MSSQLServer、Sybase等。2, OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常。. sequence l sequence 标识符生成器利用底层数据库提供的序列来生成标识符. l Hibernate 在持久化一个 News 对象时, 先从底层数据库的 news_seq 序列中获得一个唯一的标识号, 再把它作为主键值l 适用范围:1, 由于 sequence 生成标识符的机制依赖于底层数据库系统的序列,因此,要求底层数据库系统必须支持序列。支持序列的数据库包括:DB2 Oracle 等。2, OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常。. hilo l hilo 标识符生成器由 Hibernate 按照一种 high/low 算法*生成标识符, 它从数据库的特定表的字段中获取 high 值.l Hibernate 在持久化一个 News 对象时, 由 Hibernate 负责生成主键值. hilo 标识符生成器在生成标识符时, 需要读取并修改 HI_TABLE 表中的 NEXT_VALUE 值.l 适用范围:1, 由于 hilo 生存标识符机制不依赖于底层数据库系统, 因此它适合所有的数据库系统2, OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常. native l native 标识符生成器依据底层数据库对自动生成标识符的支持能力, 来选择使用 identity, sequence 或 hilo 标识符生成器. l 适用范围:1, 由于 native 能根据底层数据库系统的类型, 自动选择合适的标识符生成器, 因此很适合于跨数据库平台开发2, OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常. uuidl 适用范围:1, 由于 hilo 生成标识符机制不依赖于底层数据库系统, 因此它适合所有的数据库系统2, OID 必须为String类型. assigned assigned表示手工指定主键的值。. 映射复合主键.1. 方法一.2. 方法二4.5. Hibernate映射类型4.5.1. 内置映射类型内置映射类型Hibernatejavasql取值范围int或integerint 或java.lang.IntegerINTEGER4longLong或java.lang.LongBIGINT8shortshort ShortSMALLINT2bytebyte ByteTINYINT1floatfloat FloatFLOAT4doubledouble DoubleDOUBLE8big_decimaljava.math.BigDecinimalNUMERIC8位含2位小数部分characterchar Character StringCHAR(1)定长字符stringjava.langStringVARCHAR变长串booleanboolean或BooleanBIT布尔yes_noboolean或BooleanCHAR(1)布尔true_falseboolean或BooleanCHAR(1)布尔4.5.2. java时间和日期类性Hibernatejavasql取值范围dateutil.Date sql.DateDATEYYYY-MM-DDtimeutil.Date sql.TimeTIMEHH:MM:SStimestamputil.Date sql.timestampTIMESTAMPYYYYMMDDHHMMSScalendarjava.util.CalendarTIMESTAMPYYYYMMDDHHMMSScalendar_datejava.util.CalendarDATEYYYY-MM-DD4.5.3. 大对象类型的映射HibernatejavasqlbinarybyteVARBINARY(BLOB)textStringCLOBserializable实现类BARBINARY(BLOB)clobsql.ClobCLOBblobsql.BlobBLOB不允许以上类型来定义OID如果持久化类的字段为blob或clob类型,保存时需要包含两步:-Customer c = new Customer();/现保存一个空的clob实例c.setDescription(Hibernate.createClob();session.save(c);session.flush();/锁定记录session.refresh(customer,LockMode.UPGRADE);oracle.sql.CLOB clob = c.getDescription();/写入大文本java.io.Writer pw = clob.getCharacterOutputStream();pw.write(longtext);pw.close();mit();session.close();(Hibernate Reference3.2.2中有)JDBC 类 java.sql.Clob 和 java.sql.Blob的映射。某些程序可能不适合使用这个类型,因为blob 和 clob 对象可能在一个事务之外是无法重用的。(而且, 驱动程序对这种类型的支持充满着补丁和前后矛盾。)4.5.4. JDK自带的个别java类的映射类型Hibernatejavasqlclassjava.lang.ClassVARCHARlocalejava.util.LocaleVARCHARtimezonejava.util.TimeZoneVARCHARcurrencyjava.util.CurrencyVARCHAR5. 对象/关系数据库映射(二)5.1. 集合映射集合属性大致有两种: 单纯的集合属性,如像List、Set或数组等集合属性 Map结构的集合属性,每个属性值都有对应的Key映射 集合映射的元素大致有如下几种: list: 用于映射List集合属性 set: 用于映射Set集合属性 map:用于映射Map集合性 array:用于映射数组集合属性 bag: 用于映射无序集合 idbag:用于映射无序集合,但为集合增加逻辑次序 . Set但Set是无序,不可重复的集合。测试程序生成的表及插入的数据注:映射 Set 集合属性时,如果 element 元素包括 not-null = “true” 属性,则集合属性表以关联持久化类的外键和元素列作为联合主键,否则该表没有主键。但 List 集合属性不会,List 集合属性总是以外键列和元素此序列作为联合主键。. List List是有序集合,因此持久化到数据库时必须增加一列来表示集合元素的次序。 集合属性只能以接口声明(当持久化某个实例时, Hibernate 会自动把程序中的集合实现类替换成 Hibernate 自己的集合实现类),因此下面代码中,schools的类型能是List,不能是ArrayList,映射说明 list元素要求用list-index的子元素来映射有序集合的次序列。 集合的属性的值会存放有另外的表中,须以外键关联,用 Key 元素来映射外键列。 当集合元素是基本数据类型及其包装类, 字符串或日期类型时使用 element 来映射集合属性测试程序:生成的表及插入的数据. 数组 数组属性的映射和 List 的处理方式基本一致 数组使用 元素完成完成映射. BagBag的特性是:允许重复的元素,但无序。在Java的标准API中并没有提供Bag容器,Hibernate提供自己的Bag实现,允许您将List映射为Bag。 bag元素既可以为List集合属性映射,也可以为Collection集合属性映射。 不管是哪种集合属性,使用bag元素都将被映射成无序集合,而集合属性对应的表没有主键。 Bag 元素只需要 key 元素来映射外键列,使用 element 元素来映射集合属性的每个元素。. Map Map不仅需要映射属性值,还需要映射属性Key。 Hibnernate 将以外键列和Key列作为联合主键。 Map集合属性使用map元素映射,该元素需要key和map-key两个子元素 key子元素用于映射外键列, map-key子元素则用于映射Map集合的Key。 map-key和element元素都必须确定type属性 5.2. 组成关系(Component)映射组件属性的意思是持久化类的属性既不是基本数据类型,也不是 String 字符串,而是某个组件变量,该组件属性的类型可以是自定义类。 显然无法直接用 property 映射 name 属性。为了映射组件属性, Hibernate 提供了 component 元素。 每个 component 元素映射一个组件属性,组件属性必须指定该属性的类型,component 元素中的 class 属性用于确定组件的类型。 示例:生成的表及插入的数据:集合除了存放 String 字符串以外,还可以存放组件类型。实际上,更多情况下,集合组件存放的都是组件类型。 对于有集合属性持久化类, 需要使用 set, list, bag 等集合元素来映射集合属性。 如果集合里的元素是普通字符串,则使用 element 映射集合元素即可。 如果集合元素也是定义类,则需使用 composite-element 子元素来映射集合元素。 composite-element 元素映射一个组件类型,因此需要 class 元素确定元素的类型,该元素还支持 property 的子元素来定义组件类型的子属性5.3. 一对多关联关系映射1, 单项关联:仅仅建立从Order到Customer的多对一关联,即仅仅在Order类中定义customer属性。或者仅仅建立从Customer到Order的一对多关联,即仅仅在Customer类中定义orders集合。2, 双项关联:既建立从Order到Customer的多对一关联,又建立从Customer到Order的一对多关联5.3.1. 单向多对一单向 n-1 关联只需从 n 的一端可以访问 1 的一端。5.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业智能化与数字化转型策略
- 工业废水处理技术及其应用
- 工业机器人技术的智能化升级与改造
- 工业废水处理的新技术与策略
- 工业自动化中的数据驱动决策支持系统
- 工业物联网的挑战与机遇
- 工业生产线的自动化设备温控管理
- 工业遗址改造为现代建筑的策略
- 工业节能减排的技术创新与效益
- 工业设计与人机交互的融合
- 2025年江西江铜集团招聘笔试参考题库含答案解析
- 阿尔茨海默病源性轻度认知障碍诊疗中国专家共识2024解读
- 2025年免疫规划工作计划
- 2024年-2025年公路养护工理论知识考试题库
- 针刺伤预防与处理-2024中华护理学会团体标准
- 四年级校本课程教材-全册(自编教材)
- 酒店与代理合作协议书范文模板
- 天然气的高压物性课件
- 多模态数据融合方法
- JT∕T 791-2010 公路涵洞通道用波纹钢管(板)
- JB∕T 11864-2014 长期堵转力矩电动机式电缆卷筒
评论
0/150
提交评论