`

Hibernate学习笔记(三)对象-关系映射基础

阅读更多
1.Hibernate调用对象的getXXX()方法,读取对象信息,把它保存到数据库。调用对象的setXXX()方法,把从数据库中读出的对象信息写入到对象中。
即Hibernate的session执行save(),update()或saveOrUpdate()方法时会调用对象的getXXX()方法。
当session执行get()或load()方法时,以及Query执行查询时会调用对象的set()方法。

在持久化类中,既可把属性定义为基本类型,也可以定义为包装类型,他们对应相同的Hibernate映射类型。
比如double和Double 都是<property name="XXX" type="double" column="xxx">

Hibernate访问持久化类属性的策略(<property>元素access属性指定Hibernate访问持久化类属性的方式)
1.property:这是默认值,表明Hibernate通过get/set方法访问类的属性。优先推荐。
2.field:表明Hibernate运用Java反射机制直接访问类的属性。e.g. <property name="name" access="field">
3.还可以自定义持久化类的属性访问方式。这需要创建一个实现org.hibernate.property.PropertyAccessor接口的类,
      并将类的完整名字赋值给<property>的access属性。

2.设置派生属性
利用<property>元素的formula属性: formula属性用来设置一个sql表达式
e.g. 当表中没有对应属性字段TOTAL_PRICE时可以
<property name="totalPrice" formula="(select sum(o.PRICE) from ORDERS o where o.CUSTOMER_ID=ID)"/>
如果子查询语句查询结果为空,Hibernate会把totalPrice赋值为null,所以不能使用基本数据类型

formula指定SQL表达式中可以引用表字段,调用SQL函数或包含子查询语句
e.g. 表示客户购买单项商品信息的LineItem类中有一个unitPrice属性,取值为:商品单价(BASE_PRICE)*购买数量(QUANTITY)
<property name="unitPrice" formula="BASE_PRICE*QUANTITY"/>


3.控制insert和update语句
Hibernate在初始化阶段会根据映射文件信息,为所有的持久化类预定义insert,updatea,delete和根据OID加载数据库中持久化实例的SELECT
e.g.
insert into USER(ID,NAME) values(?,?);
update USER set NAME=? where ID=?;
delete from USER where ID=?;
select ID,NAME from USER where ID=?;
以上SQL语句中的?号代表JDBC  PreparedStatement中的参数.这些SQL语句都放在SessionFactory的内置缓存中,当执行Session的
save(),update(),delete(),load()和get()方法时,将从缓存中找到相应的SQL语句,再把参数值绑定到该SQL语句中。
Tips:HQL或QBC查询对应的select语句是在执行该代码时菜动态生成的。

默认情况下,预定义的SQL语句中包含了表的所有字段,此外Hibernate还允许在映射文件中控制insert和update语句的内容
用于控制insert和update语句的映射属性
<property>元素的insert属性:如果为false,在insert语句中不包含该字段,表明该字段永远不能被插入。默认值为true
<property>元素的update属性:如果为false,在update语句中不包含该字段,表明该字段永远不能被更新。默认值为true
<class>元素的mutable属性:如果为false,等价于所有<property>元素的update属性为false,表示整个实例不能被更新,默认值为true。
<class>元素的dynamic-insert属性:如果为true,表示当保存一个对象时,会动态生成insert语句,insert语句中仅包含所有取值不为null的字段。默认为false。
<class>元素的dynamic-update属性:如果为true,表示当更新一个对象时,会动态生成update语句,update语句中仅包含所有需要更新的字段。默认为false。

Hibernate生成动态SQL语句的系统开销很小,因此不会影响应用的运行性能。如果表中包含许多字段,建议把dynamic-insert属性
和dynamic-update属性都设为true。这样,可以节省数据库执行SQL语句的时间,从而提高应用的运行性能。


4.处理SQL引用标识符
标识符:是指用于数据库表、视图、字段或索引等命名的字符串。常规标识符不包含空格也不报告特殊字符,因此无须使用引用符号。
e.g. crete table CUSTOMERS(ID bigint not null,NAME varchar(15) ... 中的CUSTOMERS,ID和NAME都是标识符。
如果数据库表名或字段名中包含空格或特殊字符,那么可以使用引用标识符。
e.g. CUSTOMERS表中有一个引用标识符字段`CUSTOMER DESCRIPTION`
映射文件中也应该使用标识符<property name="description" column="`CUSTOMER DESCRIPTION`"/>
注意:不同数据库,引用标识符有不同的形式,SQLServer中为[],MySQL中为 `` 。在设置Hibernate映射文件时一律采用``,hibernate根据方言生成正确标识符。

5.创建命名策略
表名和字段名都大写,表名以S结尾。
可以通过实现Hibernate的org.hibernate.cfg.NamingStrategy接口实现。Hibernate提供两个参考实现类
org.hibernate.cfg.DefaultNamingStraegy类:这是NamingStrategy类的接口的默认实现类。
org.hibernate.cfg.ImprovedNamingStragegy类:这是NamingStrategy接口的高级实现类。

6.设置数据库Schema
如果一个数据库系统中调用不同的Schema中存在命名相同的表。可以在<hibernate-mapping>元素中设置一个schema属性:
e.g. <hibernate-mapping schema="schema1">则会把该映射文件中的持久化类映射为表 schema1.XXX
  如果个别类和schema2中的表映射,那么可以在这些个别类的<class>元素中设置一个schema属性<class name="Xxx" table="XXX" schema="schema2">
 
7.设置类的包名
默认情况下,在设置<class>元素的name属性时,必须提供完整的类名,即包名.类名。
如果一个映射文件下多个类属于同一个包,可以设置<hibernate-mapping>元素的package属性。 e.g. <hibernate-mapping package="mypack">
分享到:
评论

相关推荐

    hibernate学习笔记

    Hibernate 学习笔记 Hibernate 学习笔记 1 第一个hibernate项目(hibernate_first) 2 测试实体对象的生命周期(hibernate_session) 3 hibernate基本映射(hibernate_basemapping) 4 class实体类---表 4 标签id 5 ...

    Hibernate学习笔记和资料

    hibernate概述,hibernate入门Demo,hibernate配置文件详解(全局配置,实体类映射配置),配置实体规则,核心API详解(Configuration,sessionFactory,session,Transaction),hibernate中的对象状态以及刷新能缓存机制 ...

    Hibernate笔记 马士兵

    第9课 Hibernate的重点学习:Hibernate的对象关系映射 12 一、对象---关系映射模式 12 二、常用的O/R映射框架: 13 第10课 模拟Hibernate原理(OR模拟) 13 一、 项目名称 13 二、 原代码 13 第11课 Hibernate基础配置...

    Hibernate3 学习笔记.ppt

    Hibernate3 学习笔记.ppt 一、O/R Mapping 二、Hibernate入门 三、Hibernate映射申明(Mapping declaration) 四、Hibernate Annotations 五、持久化对象的状态和生命周期 六、Hibernate查询 七、Hibernate最佳实践 ...

    JPA学习笔记-EJB-04JPA关联映射总结

    感觉JPA关联映射实现感觉比Hibernate配置文件的关联映射几乎一样,只是引入了“零配置”这个概念。劣者自己在做一个东西的时候用到了关联映射,在此将它做一个总结。留给自己回顾用。

    Hibernate学习笔记(java的)

    Hibernate学习笔记(java的) 包括基础的使用和配置,有Hibernate的控制事务,映射关系等内容。 可快速入门,也可当手册使用。 更多:http://download.csdn.net/user/daillo/all

    Hibernate学习笔记

    001 Hibernate 简介(开源 O/R 映射框架) 002 第一个 Hibernate 示例 003 hibernate 主要接口介绍 004 持久对象的生命周期介绍 005 query 接口初步 006 开源 O/R 映射框架内容回顾 007 Hibernate 基本映射标签和属性...

    Spring和Hibernate学习笔记

    第三课:hibernate基本映射 第四课:hibernate多对一关联映射 ...................... Spring: 第一课:构建Spring的环境并建立一个例子 第三课:spring Bean的作用域 第四课:spring对AOP的只是(采用Annotation的...

    hibernate 3.3学习笔记

    第10课 模拟Hibernate原理(OR模拟) 第11课 Hibernate基础配置 第16课 关系映射(重点 Annotation注解)

    Hibernate学习笔记_songjignhao_1

    自己记录的学习笔记,内容很详细,有代码,包括:一对多双向关联关系、一对多双向自身关联关系、一对一关联关系(主键关联、外键关联)、一对多与一对一结合、多对多关联关系、Map、Set、List与Bag映射关系、查询...

    Hibernate - 学习笔记

    使用Hibernate对数据进行操作时会牵涉到3种类型的文件:Java类(实体类),映射文件(test.hbm.xml),数据库的表结构(表结构的创建).从理论上说只要知道其中一个,另外两个就可以从知道的那个文件中生成出来,这就涉及到先...

    Hibernate学习笔记(1)

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...

    Hibernate学习笔记(2)

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...

    Hibernate学习笔记(3)

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...

    Hibernate3.2学习笔记

    Hibernate环境搭建 Hibernate主要接口 Hibernate主要映射 Hibernate的lazy、fetch、cascade等策略 Hibernate性能优化

    hibernate的学习笔记

    hibernate的word笔记,其中包括了初始的hibernate的关系映射,以及各种关于hibernate的相关知识,配置之类的

    学习笔记,hibernate框架入门

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以...

    hibernate笔记

    7 对象的三种状态(了解) 5 8 关系映射(重点) 5 9 Hibernate査询(HQL) 5 10 在Struts基础上继续完善BBS200 5 11 性能优化(重点) 5 12 补充话题 5 风格 5 1 先脉络,后细节 5 2 先操作,后原理 5 3 重...

Global site tag (gtag.js) - Google Analytics