hibernate-4-OR映射.ppt
Hibernate框架O/R映射,本章主要内容,1.Hibernate的O/R映射文件2.映射对象标识符3.Hibernate的类型本节重点:O/R映射文件和主键生成器应用:编写简单的Hibernate程序,实现CRUD,1.O/R 映射定义,对象和关系数据库之间的映射通常是用一个XML文档(XML document)来定义的。这个映射文档被设计为易读的,并且可以手工修改。映射语言是以Java为中心,这意味着映射文档是按照持久化类的定义来创建的,而非表的定义。Hibernate的映射文件:*.hbm.xml,一个映射文件框架,注:映射文件可以包含多个类标记,但不推荐。,1.1 元素,该元素是Hibernate映射文件的根元素,包括一些可选的属性。,1.2 元素,用元素来定义一个持久化类。最常见的用法就是使用name和table来制定类和表的关联。,1.2 元素,1.2 元素,注:对Hibernate来说,视图与表是没有区别的。如果想使用视图,又不能在数据库中创建它,则可以映射一个不可变(immutable)并且是只读的实体到一个给定的SQL子查询表达式。,1.3 元素,被映射的类必须定义对应数据库主键字段。元素定义了该属性到数据表主键字段的映射。,1.3 元素,可以自定义也可以使用Hibernate内置方式,1.4 元素,JavaBean属性与数据库表字段的对应关系,1.4 元素,属性介绍如下:,1.4 元素,关于type属性可以是如下几种:(1)Hibernate基本类型名(比如:integer,string,character,date,timestamp,float,binary,serializable,object,blob)。(2)Java类的全限定类名,该类等同于上面的一种Hibernate基础类型(比如:int,float,char,)(3)一个可以序列化的Java类的名字(4)一个自定义类型的类的名字(如:),1.5其他属性,元素是可选的,指明了表中包含时间戳数据。元素是可选的,表明表中包含附带版本信息的数据。一对一和一对多持久化对象之间一对一的关联关系是通过元素定义的多对一关联通过元素定义元素允许定义一个命名的逻辑分组(grouping)包含一个类中的多个属性。元素可以定义应用程序有两个同样名字的持久化类,2.映射对象标识符,Hibernate使用对象标识符(OID)来建立内存中的对象和表中记录的对应关系,它和表的主键对应。为了保证OID的惟一性和不可变性,应该让Hibernate而不是应用程序来为OID赋值,同时带来的效果是,数据库表的主键值也是可由Hibernate生成自然主键和代理主键,推荐方式,2.1 标识符的含义,作为主键的字段必须不能为空,值唯一且永不改变Java语言按内存地址区分不同的对象。这两种方式与数据库都很难对应,Hibernate给每个对象加一个标识符来区分对象。,2.2 内置生成器介绍,Hibernate来自动生成一个OID。使用的是元素,它用来设定标识符生成器。,2.3 Hibernate的内置标示符生成器的用法,1increment标识符生成器由Hibernate以递增方式为代理主键赋值,增量为1(Hibernate在初始化时读取出表中主键最大值,在这个基础上加1)要求:其主键是long、short、int适用于单个hibernate访问同一个数据库的数据,但不可应用于集群中2UUID生成器生成的主键包含IP地址和JVM启动时间,保证网络范围内唯一,2.3 Hibernate的内置标示符生成器的用法,3identity标识符生成器由底层数据库来生成标识符要求底层数据库支持自增类型OID必须为long、int和short可用DB:MySQL、SQLServer、Servler、Sybase、DB24sequence标识符生成器由底层数据库提供序列来生成标识符要求数据库支持序列。可用DB:Oracle、DB2OID必须为long、int和short,2.3 Hibernate的内置标示符生成器的用法,5hilo标识符生成器按照high/low算法来生成标识符优点是适用于所有数据库缺点是只能在一个数据库中保证唯一OID必须为long、int和short6native标识符生成器根据数据库的能力,自动选择identity、sequence、hilo中的一种优点是适合跨平台开发缺点是OID必须为long、int和short,2.4 映射自然主键,当数据库表采用自然主键时,Hibernate使用assigned生成器来生成主键。generator的默认方式应用程序在save()之前必须手动地为对象分配一个标识符注:应尽量避免使用自然主键使用assigned生成器时,除非有一个version或timestamp属性,或者定义了Interceptor.isUnsaved(),否则需要让Hibernate使用unsaved-value=“undefined”,强制Hibernate查询数据库来确定一个实例是临时的还是脱管的。,2.5 复合自然主键,如果数据表的自然主键是复合键,那么在Hibernate中用元素定义。有3种方式可以选择:直接使用联合主键。mapped(映射式)组合标识符identifier component(标识符组件)推荐,3 Hibernate的类型,Hibernate的内置类型通常使用和Java类型相同的名字,3.1 Java基本值类型的Hibernate映射,下表列出了Hibernate映射类型、对应的JAVA基本类型(包括它们的包装类)和以及对应的标准SQL类型。,char/,3.2 Java时间和日期类型的Hibernate映射类型,在Java中,代表时间和日志的类型包括:和此外在JDBC API中还提供了三个扩展类的子类:、和,这三个类分别和标准的SQL类型中的DATA、TIME、TIMESTAMP类型对应。,3.3 Java大对象类型的Hibernate映射类型,在Java中,可用于表示长字符串(长度没有限制),字节数组byte可用于存放图片或长文件的二进制组数据。此外,在JDBC API中又提供了和类型,它们分别和标准SQL中的CLOB和BLOB类型对应。,3.4 JDK自带的JAVA类的Hibernate映射类型,Hibernate可以直接把一些常用的Java类如class、locale等类型保存在数据库中。,3.5自定义值类型,Hibernate允许开发者创建属于他们自己的值类型。步骤:创建自定义类型类。该类必须实现org.hibernate.UserType或org.hibernate.CompositeUserType 中的任一个可以为自定义的类型用标记设置一个简称。直接在标记的type属性中应用自定义类型即可注:如果想向自定义类型传递参数,可以在标记中使用元素,但该自定义类型的实现类必须实现接口。,