Hibernate_映射配置文件详解.ppt
《Hibernate_映射配置文件详解.ppt》由会员分享,可在线阅读,更多相关《Hibernate_映射配置文件详解.ppt(80页珍藏版)》请在三一办公上搜索。
1、映射文件详解,目标,学习Hibernate的配置文件(hibernate.cfg.xml)学习Hibernate的映射声明(*.hbm.xml),Hibernate配置文件,Hibernate配置文件主要用于配置数据库连接和 Hibernate 运行时所需的各种属性每个 Hibernate 配置文件对应一个 Configuration 对象。Hibernate配置文件可以有两种格式:hibernate.propertieshibernate.cfg.xml,hibernate.cfg.xml的常用属性,connection.url:数据库URL connection.username:数据库用
2、户名connection.password:数据库用户密码 connection.driver_class:数据库JDBC驱动 show_sql:是否将运行期生成的SQL输出到日志以供调试。取值 true|false dialect:配置数据库的方言,根据底层的数据库不同产生不同的sql语句,Hibernate 会针对数据库的特性在访问时进行优化。hbm2ddl.auto:在启动和停止时自动地创建,更新或删除数据库模式。取值 create|update|create-dropmapping resource:映射文件配置,配置文件名必须包含其相对于根的全路径connection.datasou
3、rce:JNDI数据源的名称,jdbc.fetch_size 和 jdbc.batch_size,jdbc.fetch_size:实质是调用 Statement.setFetchSize()方法设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数。例如一次查询1万条记录,对于Oracle的JDBC驱动来说,是不会 1 次性把1万条取出来的,而只会取出Fetch Size条数,当纪录集遍历完了这些记录以后,再去数据库取Fetch Size条数据。因此大大节省了无谓的内存消耗。当然Fetch Size设的越大,读数据库的次数越少,速度越快;Fetch Size越小,读数据库的
4、次数越多,速度越慢。Oracle数据库的JDBC驱动默认的Fetch Size=10,是一个保守的设定,根据测试,当Fetch Size=50的时候,性能会提升1倍之多,当Fetch Size=100,性能还能继续提升20%,Fetch Size继续增大,性能提升的就不显著了。建议使用Oracle时将Fetch Size设到50。并不是所有的数据库都支持Fetch Size特性,例如MySQL就不支持。MySQL就像上面那种最坏的情况,总是一下就把1万条记录完全取出来,内存消耗会非常非常惊人!这个情况就没有什么好办法了hibernate.jdbc.batch_size:设定对数据库进行批量删除
5、,批量更新和批量插入的时候的批次大小,有点相当于设置Buffer缓冲区大小的意思。Batch Size越大,批量操作的向数据库发送sql的次数越少,速度就越快。测试结果是当Batch Size=0的时候,使用Hibernate对Oracle数据库删除1万条记录需要25秒,Batch Size=50的时候,删除仅仅需要5秒!可见有多么大的性能提升!Oracle数据库 Batch Size=30 的时候比较合适。这两个选项非常重要,将严重影响Hibernate的CRUD(create,read,update,delete)性能!,配置 c3p0数据库连接池,c3p0连接池是Hibernate推荐使
6、用的连接池,若需要使用该连接池时,需要将c3p0的jar包拷贝到 WEB-INF 的 lib 目录下,POJO 类和数据库的映射文件*.hbm.xml,POJO 类和关系数据库之间的映射可以用一个XML文档(XML document)来定义。映射按照POJO的定义来创建,而非表的定义。通过 POJO 类的数据库映射文件,Hibernate可以理解持久化类和数据表之间的对应关系,也可以理解持久化类属性与数据库表列之间的对应关系,映射文件示例,映射文件说明,hibernate-mapping类层次:Class主键。id基本类型:property自定义类:many-to-one|one-to-one
7、集合:set|list|map|arrayone-to-manymany-to-many子类:subclass|joined-subclass其它:component|any等查询语句:query(用来放置查询语句,便于对数据库查询的统一管理和优化)注意:一个Hibernate-mapping中可以同时定义多个类。,hibernate-mapping,hibernate-mapping 是 hibernate 映射文件的根元素schema(可选):数据库schema的名称。catalog(可选):数据库catalog的名称。default-cascade(可选-默认为 none):默认的级联风
8、格。default-access(可选-默认为 property):Hibernate用来访问属性的策略。可以通过实现PropertyAccessor接口自定义。default-lazy(可选-默认为 true):指定了未明确注明lazy属性的Java属性和集合类,Hibernate会采取什么样的默认加载风格。auto-import(可选-默认为 true):指定我们是否可以在查询语言中使用非全限定的类名(仅限于本映射文件中的类)。package(可选):指定一个包前缀,如果在映射文档中没有指定全限定的类名,就使用这个作为包名。,class,Class:定义一个持久化类 name(可选):持久
9、化类(或者接口)的类名table(可选-默认是类的非全限定名):对应的数据库表名discriminator-value(可选-默认和类名一样):一个用于区分不同的子类的值,在多态行为时使用。它可以接受的值包括 null 和 not null。,主键-id,Id:被映射的类必须定义对应数据库表主键字段。大多数类有一个JavaBean风格的属性,为每一个实例包含唯一的标识。元素定义了该属性到数据库表主键字段的映射。name(可选):标识持久化类属性的名字。type(可选):标识Hibernate类型的名字。column(可选-默认为属性名):主键字段的名字。,主键生成策略generator,可选的
10、子元素是一个Java类的名字,用来为该持久化类的实例生成唯一的标识。如果这个生成器实例需要某些配置值或者初始化参数,用元素来传递。,主键生成策略generator,所有的生成器都实现org.hibernate.id.IdentifierGenerator接口。某些应用程序可以选择提供他们自己特定的实现。当然,Hibernate提供了很多内置的实现:,推荐使用,基本类型property,property:为类定义了一个持久化的,JavaBean风格的属性 name:属性的名字,以小写字母开头。column(可选-默认为属性名字):对应的数据库字段名。type(可选):一个Hibernate类型的
11、名字。lazy(可选-默认为 false):指定实例变量第一次被访问时,这个属性是否延迟抓取(fetched lazily)。unique(可选):为该字段添加唯一的约束。not-null(可选):为该字段添加非空约束。optimistic-lock(可选-默认为 true):指定这个属性在做更新时是否需要获得乐观锁定(optimistic lock)。,Hibernate内置映射类型,Hibernate内置映射类型,映射集合属性,集合属性大致有两种:单纯的集合属性,如像List、Set或数组等集合属性Map结构的集合属性,每个属性值都有对应的Key映射 集合映射的元素大致有如下几种:list
12、:用于映射List集合属性 set:用于映射Set集合属性 map:用于映射Map集合性 array:用于映射数组集合属性 bag:用于映射无序集合 idbag:用于映射无序集合,但为集合增加逻辑次序,List集合映射,List是有序集合,因此持久化到数据库时也必须增加一列来表示集合元素的次序。看下面的持久化类,该News类有个集合属性:schools,该属性对应学校。而集合属性只能以接口声明,因此下面代码中,schools的类型能是List,不能是ArrayList,但该集合属性必须使用实现类完成初始化。,List集合映射,在作相应映射时,list元素要求用list-index的子元素来映射
13、有序集合的次序列。集合的属性的值会存放有另外的表中,不可能与持久化类存储在同一个表内。因此须以外键关联,用Key元素来映射该外键列。,List集合映射,测试程序:,List集合映射,生成的表及插入的数据:person_table,List集合映射,生成的表及插入的数据:school_table,Set集合映射,Set集合属性映射与List非常相似,但因为Set是无序的,不可重复的集合。因此set元素无须使用index元素来指定集合元素次序。映射文件与List相似,区别在于使用set元素时,无须增加index列来保存集合的次序,Set集合映射,测试程序,Set集合映射,生成的表及插入的数据:sc
14、hool_table,注:映射 Set 集合属性时,如果 element 元素包括 not-null=“true”属性,则集合属性表以关联持久化类的外键和元素列作为联合主键,否则该表没有主键。但 List 集合属性不会,List 集合属性总是以外键列和元素此序列作为联合主键。,bag元素映射,bag元素既可以为List集合属性映射,也可以为Collection集合属性映射。不管是哪种集合属性,使用bag元素都将被映射成无序集合,而集合属性对应的表没有主键。Bag 元素只需要 key 元素来映射外键列,使用 element 元素来映射集合属性的每个元素。,Map集合属性,Map不仅需要映射属性值
15、,还需要映射属性Key。映射Map集合属性时,同样需要指定外键列,同时还必须指定Map的Key列。系统将以外键列和Key列作为联合主键。Map集合属性使用map元素映射时,该map元素需要key和map-key两个子元素。其中key子元素用于映射外键列,而map-key子元素则用于映射Map集合的Key。而map-key和element元素都必须确定type属性,集合属性的性能的分析,对于集合属性,通常推荐使用延迟加载策略。所谓延迟加载就是当系统需要使用集合属性时才从数据库装载关联的数据。Hibernate对集合属性默认采用延迟加载,在某些特殊的情况下为set,,list,map等元素设置la
16、zy=“false”属性来取消延迟加载。可将集合分成如下两类:有序集合:集合里的元素可以根据Key或Index访问 无序集合:集合里的元素中只能遍历 有序集合拥有由 key 和 index 组成的联合主键,集合的属性在增加、删除及修改中拥有较好的性能表现-主键已经被有效的索引,因此 Hibernate 可以迅速的找到该行数据。映射Set集合属性时,如果element元素包括not-null=“true”属性,则集合属性表以关联持久化类的外键和元素列作为联合主键,否则该表没有主键,因此性能较差。在设计较好的Hiberate domain Object中,集合属性通常都会增加inverse=“tr
17、ue”的属性,此时集合端不再控制关联关系。因此无需考虑集合的更新性能。,映射组件属性,组件属性的意思是持久化类的属性既不是基本数据类型,也不是 String 字符串,而是某个组件变量,该组件属性的类型可以是自定义类。,映射组件属性,显然无法直接用 property 映射 name 属性。为了映射组件属性,Hibernate 提供了 component 元素。每个 component 元素映射一个组件属性,组件属性必须指定该属性的类型,component 元素中的 class 属性用于确定组件的类型。,映射组件属性,测试程序,映射组件属性,生成的表及插入的数据:worker_table,集合组件
18、属性映射,集合除了存放 String 字符串以外,还可以存放组件类型。实际上,更多情况下,集合组件存放的都是组件类型。,集合组件属性映射,对于有集合属性 POJO,需要使用 set,list,bag 等集合元素来映射集合属性。如果集合里的元素是普通字符串,则使用 element 映射集合元素即可。如果集合元素也是定义类,则需使用 composite-element 子元素来映射集合元素。composite-element 元素映射一个组件类型,因此需要 class 元素确定元素的类型,该元素还支持 property 的子元素来定义组件类型的子属性,Hibernate 的关联关系映射,客观世界中
19、的对象很少有孤立存在的。关联关系是面向对象分析,面向对象设计最重要的知识。关联关系大致有如下两个分类:单向关系:只需要单向访问关联端单向 1-1单向 1-N(不推荐使用)单向 N-1单向 N-N双向关系:关联的两端可以相互访问双向 1-1双向 1-N双向 N-N,单向 N-1,单向 N-1 关联只需从 N 的一端可以访问 1 的一端。模型:多个人(Person)对应同一个地址(Address)。只需要从人实体端找到相应的地址实体。无须关心从某个地址找到全部住户。,单向 N-1,Person 端增加了 Address 属性,该属性不是一个普通的组件属性,而是引用了另外一个持久化类,使用 many
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hibernate_ 映射 配置文件 详解
链接地址:https://www.31ppt.com/p-2840717.html