Hibernate-对象关系映射课件.ppt

上传人(卖家):三亚风情 文档编号:2869214 上传时间:2022-06-06 格式:PPT 页数:67 大小:791.50KB
下载 相关 举报
Hibernate-对象关系映射课件.ppt_第1页
第1页 / 共67页
Hibernate-对象关系映射课件.ppt_第2页
第2页 / 共67页
Hibernate-对象关系映射课件.ppt_第3页
第3页 / 共67页
Hibernate-对象关系映射课件.ppt_第4页
第4页 / 共67页
Hibernate-对象关系映射课件.ppt_第5页
第5页 / 共67页
点击查看更多>>
资源描述

1、Prepared by TongGang对象关系映射对象关系映射Prepared by TongGangHibernate 配置文件Prepared by TongGangHibernateHibernate配置文件配置文件 Hibernate 配置文件主要用于配置数据库连接和 Hibernate 运行时所需的各种属性 每个 Hibernate 配置文件对应一个 Configuration 对象 Hibernate配置文件可以有两种格式:hibernate.propertieshibernate.cfg.xmlhibernate.cfg.xml Prepared by TongGanghibe

2、rnate.cfg.xml的常用属性 JDBC 连接属性connection.url:数据库URL connection.username:数据库用户名connection.password:数据库用户密码 connection.driver_class:数据库JDBC驱动 dialectdialect:配置数据库的方言,根据底层的数据库不同产生不同的sql语句,Hibernate 会针对数据库的特性在访问时进行优化Prepared by TongGanghibernate.cfg.xml的常用属性 C3P0 数据库连接池属性 hibernate.connection.provider_cla

3、ss: 该类用来向 Hibernate 提供JDBC连接 hibernate.c3p0.max_size: 数据库连接池的最大连接数 hibernate.c3p0.min_size: 数据库连接池的最小连接数 hibernate.c3p0.timeout: 数据库连接池中连接对象在多长时间没有使用过后,就应该被销毁 hibernate.c3p0.max_statements: 缓存 Statement 对象的数量 hibernate.c3p0.idle_test_period: 表示连接池检测线程检测线程多长时间检测一次池内的所有链接对象是否超时. 连接池本身不会把自己从连接池中移除,而是专门

4、有一个线程按照一定的时间间隔来做这件事,这个线程通过比较连接对象最后一次被使用时间和当前时间的时间差来和 timeout 做对比,进而决定是否销毁这个连接对象。 hibernate.c3p0.acquire_increment: 当数据库连接池中的连接耗尽时, 同一时刻获取多少个数据库连接 hibernate.c3p0.validate: 是否每次连接都验证连接是否可用Prepared by TongGanghibernate.cfg.xml的常用属性 其他 show_sql:是否将运行期生成的SQL输出到日志以供调试。取值 true | false format_sql:是否将 SQL 转化

5、为格式良好的 SQL . 取值 true | false use_sql_comments:是否在 Hibernate 生成的 SQL 语句中添加有助于调试的注释 hbm2ddl.auto:在启动和停止时自动地创建,更新或删除数据库模式。取值 create | update | create-drop | validate* hibernate.jdbc.fetch_size hibernate.jdbc.batch_sizePrepared by TongGangjdbc.fetch_sizejdbc.fetch_size 和和 jdbc.batch_sizejdbc.batch_size

6、hibernate.jdbc.fetch_size:实质是调用 Statement.setFetchSize() 方法设定设定 JDBC JDBC 的的 Statement Statement 读取数据读取数据的时候每次从数据库中取出的记录条数的时候每次从数据库中取出的记录条数。例如一次查询1万条记录,对于Oracle的JDBC驱动来说,是不会 1 次性把1万条取出来的,而只会取出 fetchSize 条数,当记录集遍历完了这些记录以后,再去数据库取 fetchSize 条数据。因此大大节省了无谓的内存消耗。Fetch Size设的越大,读数据库的次数越少,速度越快;Fetch Size越小,

7、读数据库的次数越多,速度越慢。Oracle数据库的JDBC驱动默认的Fetch Size = 10,是一个保守的设定,根据测试,当Fetch Size=50时,性能会提升1倍之多,当 fetchSizeetchSize=100=100,性能还能继续提升20%,Fetch Size继续增大,性能提升的就不显著了。并不是所有的数据库都支持Fetch Size特性,例如MySQL就不支 hibernate.jdbc.batch_size:设定对数据库进行批量删除,批量更设定对数据库进行批量删除,批量更新和批量插入的时候的批次大小新和批量插入的时候的批次大小,类似于设置缓冲区大小的意思。batchSi

8、ze 越大,批量操作的向数据库发送sql的次数越少,速度就越快。测试结果是当Batch Size=0的时候,使用Hibernate对Oracle数据库删除1万条记录需要25秒,Batch Size = 50的时候,删除仅仅需要5秒!Oracle数据库 batchSizeatchSize=30=30 的时候比较合适。Prepared by TongGang对象关系映射文件Prepared by TongGang实体类和数据库的映射文件*.hbm.xml 实体类和关系数据库之间的映射可以用一个XML文档来定义。 通过实体类的数据库映射文件,Hibernate可以理解持久化类和数据表之间的对应关系,

9、也可以理解持久化类属性与数据库表列之间的对应关系 在运行时 Hibernate 将根据这个映射文件来生成各种 SQL 语句 映射文件的扩展名为 .hbm.xmlPrepared by TongGang映射文件说明 hibernate-mapping类层次:class 主键。id 基本类型:property 实体引用类: many-to-one | one-to-one 集合:set | list | map | arrayone-to-manymany-to-many 子类:subclass | joined-subclass 其它:component | any 等查询语句:query(用来

10、放置查询语句,便于对数据库查询的统一管理和优化) 一个 hibernate-mapping 中可以同时定义多个类. 但更推荐推荐为每个类都创建一个单独的映射文件为每个类都创建一个单独的映射文件Prepared by TongGanghibernate-mappinghibernate-mapping hibernate-mapping 是是 hibernate hibernate 映射文件的映射文件的根元素根元素 schema: schema: 指定所映射的数据库指定所映射的数据库schemaschema的名称。若指定该的名称。若指定该属性属性, , 则表明会自动添加该则表明会自动添加该 sc

11、hema schema 前缀前缀 catalog:catalog:指定所映射的数据库指定所映射的数据库catalogcatalog的名称。的名称。 default-cascadedefault-cascade( (默认为默认为 none): none): 设置设置hibernatehibernate默认的默认的级联风格级联风格. . 若配置若配置 Java Java 属性属性, , 集合映射时没有指定集合映射时没有指定 cascade cascade 属性属性, , 则则 Hibernate Hibernate 将采用此处指定的级联风将采用此处指定的级联风格格. . default-acces

12、sdefault-access ( (默认为默认为 property): property): 指定指定 Hibernate Hibernate 的默认的属性访问策略。默认值为的默认的属性访问策略。默认值为 property, property, 即使用即使用 getter, setter getter, setter 方法来访问属性方法来访问属性. . 若指定若指定 access, access, 则则 Hibernate Hibernate 会忽略会忽略 getter/setter getter/setter 方法方法, , 而通过反射访而通过反射访问成员变量问成员变量. . defaul

13、t-lazydefault-lazy( (默认为默认为 true): true): 设置设置 HibernatHibernat morning morning的延迟加载策略的延迟加载策略. . 该属性的默认值为该属性的默认值为 true, true, 即启用延迟即启用延迟加载策略加载策略. . 若配置若配置 Java Java 属性映射属性映射, , 集合映射时没有指集合映射时没有指定定 lazy lazy 属性属性, , 则则 Hibernate Hibernate 将采用此处指定的延迟加将采用此处指定的延迟加载策略载策略 auto-import (auto-import (默认为默认为 t

14、rue): true): 指定是否可以在查询语言指定是否可以在查询语言中使用非全限定的类名(仅限于本映射文件中的类)。中使用非全限定的类名(仅限于本映射文件中的类)。 package (package (可选可选): ): 指定一个包前缀,如果在映射文档中指定一个包前缀,如果在映射文档中没有指定全限定的类名,没有指定全限定的类名, 就使用这个作为包名。就使用这个作为包名。 Prepared by TongGangclassclass class 元素用于指定类和表的映射元素用于指定类和表的映射 namename: :指定该持久化类映射的持久化类的类名指定该持久化类映射的持久化类的类名 tabl

15、etable: :指定该持久化类映射的表名指定该持久化类映射的表名, Hibernate , Hibernate 默认默认以持久化类的类名作为表名以持久化类的类名作为表名 dynamic-insertdynamic-insert: : 若设置为若设置为 true, true, 表示当保存一个表示当保存一个对象时对象时, , 会动态生成会动态生成 insert insert 语句语句, insert , insert 语句中语句中仅包含所有取值不为仅包含所有取值不为 null null 的字段的字段. . 默认值为默认值为 falsefalse dynamic-updatedynamic-upd

16、ate: : 若设置为若设置为 true, true, 表示当更新一个表示当更新一个对象时对象时, , 会动态生成会动态生成 update update 语句语句, update , update 语句中语句中仅包含所有取值需要更新的字段仅包含所有取值需要更新的字段. . 默认值为默认值为 falsefalse select-before-updateselect-before-update: :设置设置 Hibernate Hibernate 在更新某个在更新某个持久化对象之前是否需要先执行一次查询持久化对象之前是否需要先执行一次查询. . 默认值为默认值为 falsefalse batch

17、-sizebatch-size: :在关联对象图时在关联对象图时, , 指定根据指定根据 OID OID 来抓取来抓取实例时每批抓取的实例数实例时每批抓取的实例数. . lazylazy: : 指定是否使用延迟加载指定是否使用延迟加载. . mutablemutable: : 若设置为若设置为 true, true, 等价于所有的等价于所有的 元素的元素的 update update 属性为属性为 false, false, 表示整表示整个实例不能被更新个实例不能被更新. . 默认为默认为 true. true. discriminator-valuediscriminator-value:

18、: 指定区分不同子类的值指定区分不同子类的值. . 当当使用使用 元素来定义持久化类的继承关系元素来定义持久化类的继承关系时需要使用该属性时需要使用该属性Prepared by TongGang映射对象标识符 Hibernate 使用对象标识符使用对象标识符(OID) (OID) 来建立内存中的对象和数来建立内存中的对象和数据库表中记录的对应关系据库表中记录的对应关系. 对象的 OID 和数据表的主键对应. Hibernate 通过标识符生成器来为 OID 赋值 Hibernate Hibernate 推荐在数据表中使用代理主键推荐在数据表中使用代理主键, , 即不具备业务含即不具备业务含义的

19、字段义的字段. 代理主键通常为整数类型, 因为整数类型比字符串类型要节省更多的数据库空间. 在对象-关系映射文件中, 元素用来设置对象标识符. 子元素用来设定标识符生成器. Hibernate 提供了标识符生成器接口: IdentifierGenerator, 并提供了各种内置实现Prepared by TongGangididid:设定持久化类的:设定持久化类的 OID OID 和表的主键的映射和表的主键的映射 namename: : 标识持久化类标识持久化类 OID OID 的属性名的属性名 columncolumn: : 设置标识属性所映射的数据列的列名设置标识属性所映射的数据列的列名(

20、 (主键字段的主键字段的名字名字). ). unsaved-valueunsaved-value: :若设定了该属性若设定了该属性, Hibernate , Hibernate 会通过比较持会通过比较持久化类的久化类的 OID OID 值和该属性值来区分当前持久化类的对象是值和该属性值来区分当前持久化类的对象是否为临时对象否为临时对象 typetype: :指定指定 Hibernate Hibernate 映射类型映射类型. Hibernate . Hibernate 映射类型是映射类型是 Java Java 类型与类型与 SQL SQL 类型的桥梁类型的桥梁. . 如果没有为某个属性显式设如

21、果没有为某个属性显式设定映射类型定映射类型, Hibernate , Hibernate 会运用反射机制先识别出持久化类会运用反射机制先识别出持久化类的特定属性的的特定属性的 Java Java 类型类型, , 然后自动使用与之对应的默认的然后自动使用与之对应的默认的 Hibernate Hibernate 映射类型映射类型 Java Java 的基本数据类型和包装类型对应相同的的基本数据类型和包装类型对应相同的 Hibernate Hibernate 映映射类型射类型. . 基本数据类型无法表达基本数据类型无法表达 null, null, 所以对于所以对于持久化类持久化类的的 OID OID

22、 推荐使用包装类型推荐使用包装类型Prepared by TongGanggeneratorgenerator generatorgenerator:设定持久化类设定标识符生成器:设定持久化类设定标识符生成器 class: class: 指定使用的标识符生成器全限定类名或其缩写名指定使用的标识符生成器全限定类名或其缩写名Prepared by TongGang主键生成策略主键生成策略generatorgenerator Hibernate提供的内置标识符生成器: Prepared by TongGangincrement 标识符生成器 increment 标识符生成器由由 HibernateH

23、ibernate 以递增的方式为代理主键赋值 Hibernate 会先读取 NEWS 表中的主键的最大值, 而接下来向 NEWS 表中插入记录时, 就在 max(id) 的基础上递增, 增量为 1. 适用范围:由于 increment 生存标识符机制不依赖于底层数据库系统, 因此它适合所有的数据库系统适用于只有单个 Hibernate 应用进程应用进程访问同一个数据库的场合, 在集群环境下不推荐使用它不推荐使用它OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常Prepared by TongGangidentity 标识符

24、生成器 identity 标识符生成器由底层数据库来负责生成标识符, 它要求底层数据库把主键定义为自动增长字段类型把主键定义为自动增长字段类型 适用范围:由于 identity 生成标识符的机制依赖于底层数据库系统, 因此, 要求底层数据库系统必须支持自动增长字段类型要求底层数据库系统必须支持自动增长字段类型. 支持自动增长字段类型的数据库包括: DB2, Mysql, MSSQLServer, Sybase 等OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常Prepared by TongGangsequence 标识符

25、生成器 sequence 标识符生成器利用底层数据库提供的序列序列来生成标识符. Hibernate 在持久化一个 News 对象时, 先从底层数据库的 news_seq 序列中获得一个唯一的标识号, 再把它作为主键值 适用范围:由于 sequence 生成标识符的机制依赖于底层数据库系统的序列, 因此, 要求底层数据库系统必须支持序列底层数据库系统必须支持序列. 支持序列的数据库包括: DB2 Oracle 等OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常Prepared by TongGanghilo 标识符生成器

26、hilo 标识符生成器由 Hibernate 按照一种 high/low 算法算法*生成标识符, 它从数据库的特定表的字段中获取 high 值. Hibernate 在持久化一个 News 对象时, 由 Hibernate 负责生成主键值. hilohilo 标识符生成器在生成标识符时标识符生成器在生成标识符时, , 需要需要读取并修改读取并修改 HI_TABLE HI_TABLE 表中的表中的 NEXT_VALUE NEXT_VALUE 值值. 适用范围:由于 hilo 生存标识符机制不依赖于底层数据库系统, 因此它适合所有的数据库系统OID 必须为 long, int 或 short 类型

27、, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常Prepared by TongGangnative 标识符生成器 native 标识符生成器依据底层数据库对自动生成标识符的支持能力, 来选择使用 identity, sequence 或 hilo 标识符生成器. 适用范围:由于 native 能根据底层数据库系统的类型, 自动选择合适的标识符生成器, 因此很适合于跨数据库平台开发OID 必须为 long, int 或 short 类型, 如果把 OID 定义为 byte 类型, 在运行时会抛出异常Prepared by TongGangPropertyproperty pro

28、perty 元素用于指定类的属性和表的字段元素用于指定类的属性和表的字段的映射的映射 namename: :指定该持久化类的属性的名字指定该持久化类的属性的名字 columncolumn: :指定与类的属性映射的表的字段名指定与类的属性映射的表的字段名. . 如果没有如果没有设置该属性设置该属性, Hibernate , Hibernate 将直接使用类的属性名作为将直接使用类的属性名作为字段名字段名. . typetype: :指定指定 Hibernate Hibernate 映射类型映射类型. Hibernate . Hibernate 映射类映射类型是型是 Java Java 类型与类型

29、与 SQL SQL 类型的桥梁类型的桥梁. . 如果没有为某个如果没有为某个属性显式设定映射类型属性显式设定映射类型, Hibernate , Hibernate 会运用反射机制会运用反射机制先识别出持久化类的特定属性的先识别出持久化类的特定属性的 Java Java 类型类型, , 然后自然后自动使用与之对应的默认的动使用与之对应的默认的 Hibernate Hibernate 映射类型映射类型. . not-nullnot-null: :若该属性值为若该属性值为 true, true, 表明不允许为表明不允许为 null, null, 默认为默认为 falsefalse insertins

30、ert: : 如果为如果为 false, false, 在在 insert insert 语句中不包含该语句中不包含该字段字段, , 表明该字段永远不能被插入表明该字段永远不能被插入. . 默认值为默认值为 truetrue updateupdate: :如果为如果为 false, false, 在在 update update 语句中不包含该字语句中不包含该字段段, , 表明该字段永远不能被更新表明该字段永远不能被更新. . 默认值为默认值为 truetrue accessaccess: :指定指定 Hibernate Hibernate 的默认的属性访问策略。默的默认的属性访问策略。默认值

31、为认值为 property, property, 即使用即使用 getter, setter getter, setter 方法来访方法来访问属性问属性. . 若指定若指定 access, access, 则则 Hibernate Hibernate 会忽略会忽略 getter/setter getter/setter 方法方法, , 而通过反射访问成员变量而通过反射访问成员变量Prepared by TongGangproperty property 元素用于指定类的属性和表的字段元素用于指定类的属性和表的字段的映射的映射 uniqueunique: : 设置是否为该属性所映射的数据列添加唯

32、一设置是否为该属性所映射的数据列添加唯一约束约束. . 若设置为若设置为 true, true, 就允许该字段作为就允许该字段作为 property-property-ref ref 引用的目标引用的目标 indexindex: : 指定一个字符串的索引名称指定一个字符串的索引名称. . 当系统需要当系统需要 Hibernate Hibernate 自动建表时自动建表时, , 用于为该属性所映射的数据用于为该属性所映射的数据列创建索引列创建索引, , 从而加快给予该数据列的查询从而加快给予该数据列的查询. . lengthlength: : 指定该属性所映射数据列的字段的长度指定该属性所映射数

33、据列的字段的长度 scalescale: : 指定该属性所映射数据列的小数位数指定该属性所映射数据列的小数位数, , 对对 double, float, decimal double, float, decimal 等类型的数据列有效等类型的数据列有效. . formulaformula:设置一个:设置一个 SQL SQL 表达式表达式, Hibernate , Hibernate 将根据将根据它来计算出派生属性的值它来计算出派生属性的值. . 派生属性派生属性: : 并不是持久化类的所有属性都直接和表的并不是持久化类的所有属性都直接和表的字段匹配字段匹配, , 持久化类的有些属性的值必须在运

34、行时通持久化类的有些属性的值必须在运行时通过计算才能得出来过计算才能得出来, , 这种属性称为派生属性这种属性称为派生属性使用使用 formula formula 属性时属性时 formula=“(sqlformula=“(sql)” )” 的英文括号不能少的英文括号不能少 SqlSql 表达式中的列名和表名都应该和数据库对应表达式中的列名和表名都应该和数据库对应, , 而而不是和持久化对象的属性对应不是和持久化对象的属性对应 如果需要在如果需要在 formula formula 属性中使用参数属性中使用参数, , 这直接使用这直接使用 where cur.idwhere cur.id=id

35、=id 形式形式, , 其中其中 id id 就是参数就是参数, , 和当前和当前持久化对象的持久化对象的 id id 属性对应的列的属性对应的列的 id id 值将作为参数值将作为参数传入传入. . Property*Prepared by TongGangJava Java 类型类型, Hibernate , Hibernate 映射类型及映射类型及 SQL SQL 类型之间的对应关系类型之间的对应关系 Prepared by TongGangJava Java 类型类型, Hibernate , Hibernate 映射类型及映射类型及 SQL SQL 类型之间的对应关系类型之间的对应关

36、系Prepared by TongGangJava 时间和日期类型的 Hibernate 映射类型在 Java 中, 代表时间和日期的类型包括: java.util.Date 和 java.util.Calendar. 此外, 在 JDBC API 中还提供了 3 个扩展了 java.util.Date 类的子类: java.sql.Date, java.sql.Time 和 java.sql.Timestamp, 这三个类分别和标准 SQL 类型中的 DATE, TIME 和 TIMESTAMP 类型对应在标准 SQL 中, DATE 类型表示日期, TIME 类型表示时间, TIMESTA

37、MP 类型表示时间戳, 同时包含日期和时间信息. Prepared by TongGangJava 大对象类型的 Hiberante 映射类型在 Java 中, java.lang.String 可用于表示长字符串(长度超过 255), 字符数组 byte 可用于存放图片或文件的二进制数据. 此外, 在 JDBC API 中还提供了 java.sql.Clob 和 java.sql.Blob 类型, 它们分别和标准 SQL 中的 CLOB 和 BLOB 类型对应. CLOB 表示字符串大对象(Character Large Object), BLOB表示二进制大对象(Binary Large

38、Object)Mysql 不支持标准 SQL 的 CLOB 类型, 在 Mysql 中, 用 TEXT, MEDIUMTEXT 及 LONGTEXT 类型来表示长度操作 255 的长文本数据在持久化类中, 二进制大对象可以声明为 byte 或 java.sql.Blob 类型; 字符串可以声明为 java.lang.String 或 java.sql.Blob实际上在 Java 应用程序中处理长度超过 255 的字符串, 使用 java.lang.String 比 java.sql.Clob 更方便; 使用 byte 比 java.sql.Blob 更方便. Prepared by TongG

39、ang使用 Hibernate 内置映射类型 以下情况下必须显式指定必须显式指定 Hibernate Hibernate 映射类型映射类型一个 Java 类型对应多个 Hibernate 映射类型时. 例如: 如果持久化类的属性为 java.util.Date 类型, 对应的 Hibernate 映射类型可以是 date, time 或 timestamp. 此时必须根据对应的数据表的字段的 SQL 类型, 来确定 Hibernate 映射类型. 如果字段为 DATE 类型, 那么 Hibernate 映射类型为 date; 如果字段为 TIME 类型, 那么 Hibernate 映射类型为

40、time; 如果字段为 TIMESTATMP 类型, 那么 Hibernate 映射类型为 timestamp.Prepared by TongGang练习1根据给定的 Java 类写出相对应的 hbm.xml 文件, 由 Hibernate 生成 对应的数据表,并完成对 Customer 记录在数据表中增删改查操作Prepared by TongGang映射组成关系* 建立域模型和关系数据模型有着不同的出发点:域模型: 由程序代码组成由程序代码组成, , 通过细化持久化类的的粒度可提高代码的可通过细化持久化类的的粒度可提高代码的可重用性重用性, , 简化编程简化编程关系数据模型: 由关系数据

41、组成由关系数据组成, 在存在数据冗余的情况下, 需要把粗粒度的表拆分成具有外键参照关系的几个细粒度的表, 从而节省存储空间; 另一方面, 在没有数据冗余的情况下在没有数据冗余的情况下, , 应该尽可能减少表的数目应该尽可能减少表的数目, , 简化表之间的参照关系简化表之间的参照关系, , 以便提高数据的访问速度以便提高数据的访问速度Prepared by TongGang映射组成关系 Hibernate 把持久化类的属性分为两种: 值值(value)(value)类型类型: 没有没有 OIDOID, 不能被单独持久化不能被单独持久化, 生命周期依赖于所属生命周期依赖于所属的持久化类的对象的生命

42、周期的持久化类的对象的生命周期实体(entity)类型: 有 OID, 可以被单独持久化, 有独立的生命周期 显然无法直接用 property 映射 name 属性 Hibernate 使用 元素来映射组成关系, 该元素表明 pay 属性是 Worker 类一个组成部分, 在 Hibernate 中称之为组件组件Prepared by TongGangcomponent 元素来映射组成关系元素来映射组成关系 class:class:设定组成关系属性的类型设定组成关系属性的类型, , 此处表明此处表明 pay pay 属属性为性为 Pay Pay 类型类型 parent 元素元素指定指定组件属性

43、所属的整体类组件属性所属的整体类 name: name: 整体类在组件类中的属性名整体类在组件类中的属性名Prepared by TongGang映射一对多关联关系Prepared by TongGang一对多关联关系 在域模型中, 类与类之间最普遍的关系就是关联关系. 在 UML 中, 关联是有方向的. 以 Customer 和 Order 为例: 一个用户能发出多个订单, 而一个订单只能属于一个客户. 从 Order 到 Customer 的关联使多对一关联; 而从 Customer 到 Order 是一对多关联 单向关联 双向关联Prepared by TongGang单向 n-1 单向

44、 n-1 关联只需从 n 的一端可以访问 1 的一端 域模型: 从 Order 到 Customer 的多对一单向关联需要在Order 类中定义一个 Customer 属性, 而在 Customer 类中无需定义存放 Order 对象的集合属性 关系数据模型:ORDERS 表中的 CUSTOMER_ID 参照 CUSTOMER 表的主键ORDERS 表CUSTOMERS 表Prepared by TongGang单向 n-1 显然无法直接用 property 映射 customer 属性 因为 Customer 有主键, 所以也不能使用 component 进行映射 Hibernate 使用

45、元素来映射多对一关联关系Prepared by TongGangmany-to-one many-to-one 元素来映射元素来映射多对一的关联关系多对一的关联关系 name: name: 设定待映射的持久化类的属性的名字设定待映射的持久化类的属性的名字 column: column: 设定和持久化类的属性对应的表的外键设定和持久化类的属性对应的表的外键 classclass:设定待映射的持久化类的属性的类型:设定待映射的持久化类的属性的类型Prepared by TongGang双向 1-n 双向 1-n 与 双向 n-1 是完全相同的两种情形 双向 1-n 需要在 1 的一端可以访问 n

46、的一端, 反之依然. 域模型:从 Order 到 Customer 的多对一单向关联需要在Order 类中定义一个 Customer 属性, 而在 Customer 类中需定义存放 Order 对象的集合属性 关系数据模型:ORDERS 表中的 CUSTOMER_ID 参照 CUSTOMER 表的主键ORDERS 表CUSTOMERS 表Prepared by TongGang双向 1-n 当 Session 从数据库中加载 Java 集合时, 创建的是 Hibernate 内置集合类的实例, 因此在持久化类中定义集合属在持久化类中定义集合属性时必须把属性声明为性时必须把属性声明为 Java

47、Java 接口类型接口类型Hibernate 的内置集合类具有集合代理功能, 支持延迟检索策略Hibernate 的内置集合类都封装了 JDK 中的集合类, 这使得 Hibernate 能够对缓存中的集合对象进行脏检查, 按照集合对象的状态来同步更新数据库。 在定义集合属性时在定义集合属性时, , 通常把它初始化为集合实现类的一个实例通常把它初始化为集合实现类的一个实例. 这样可以提高程序的健壮性, 避免应用程序访问取值为 null 的集合的方法而抛出 NullPointerExceptionPrepared by TongGang双向 1-n Hibernate 使用 元素来映射 set 类

48、型的属性Prepared by TongGangset set 元素来映射元素来映射持久化持久化类的类的 set set 类型的属性类型的属性 name: name: 设定待映射的持久化类的属性名设定待映射的持久化类的属性名Prepared by TongGangkey key 元素元素设定设定与所关联的持久化类对应的表的外键与所关联的持久化类对应的表的外键 column: column: 指定关联表的外键名指定关联表的外键名Prepared by TongGangone-to-many one-to-many 元素元素设定设定集合属性中所关联的持久化集合属性中所关联的持久化类类 class:

49、 class: 指定关联的持久化类的类名指定关联的持久化类的类名Prepared by TongGangcascade 属性在对象 关系映射文件中, 用于映射持久化类之间关联关系的元素, , 和 都有一个 cascade 属性, 它用于指定如何操指定如何操纵与当前对象关联的其他对象纵与当前对象关联的其他对象. Prepared by TongGang 元素的 inverse 属性 在在hibernatehibernate中通过对中通过对 inverse inverse 属性的来决定是由双向关联属性的来决定是由双向关联的哪一方来维护表和表之间的关系的哪一方来维护表和表之间的关系. inverse

50、=false . inverse=false 的为主的为主动方,动方,inverse=true inverse=true 的为被动方的为被动方, , 由主动方负责维护关联由主动方负责维护关联关系关系 在没有设置在没有设置 inverse=true inverse=true 的情况下,父子两边都维护父子的情况下,父子两边都维护父子 关系关系 在 1-n 关系中,将 n 方设为主控方将有助于性能改善(如果要国家元首记住全国人民的名字,不是太可能,但要让全国人民知道国家元首,就容易的多) 在 1-N 关系中,若将 1 方设为主控方会额外多出 update 语句。插入数据时无法同时插入外键列,因而无法

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 办公、行业 > 各类PPT课件(模板)
版权提示 | 免责声明

1,本文(Hibernate-对象关系映射课件.ppt)为本站会员(三亚风情)主动上传,163文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。
2,用户下载本文档,所消耗的文币(积分)将全额增加到上传者的账号。
3, 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(发送邮件至3464097650@qq.com或直接QQ联系客服),我们立即给予删除!


侵权处理QQ:3464097650--上传资料QQ:3464097650

【声明】本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是网络空间服务平台,本站所有原创文档下载所得归上传人所有,如您发现上传作品侵犯了您的版权,请立刻联系我们并提供证据,我们将在3个工作日内予以改正。


163文库-Www.163Wenku.Com |网站地图|