被映射的类必须定义对应数据库表主键字段。大多数类有一个JavaBeans风格的属性, 为每一个实例包含唯一的标识。<id> 元素定义了该属性到数据库表主键字段的映射。
(1) name (可选): 标识属性的名字
(2) type (可选): 标识Hibernate类型的名字
(3) column (可选 - 默认为属性名): 主键字段的名字
(4) unsaved-value (可选 - 默认为一个切合实际(sensible)的值): 一个特定的标识属性值,用来标志该实例是刚刚创建的,尚未保存。 unsaved-value 属性在Hibernate4中几乎不再需要。
(5) access (可选 - 默认为property):Hibernate用来访问属性值得策略
Hibernate的类型
Hibernate在进行映射的时候,既不使用Java的类型,也不使用数据库的类型,而是使用自己提供的类型, Hibernate提供大量的内建类型,也支持自定义类型。
Hibernate的内建类型
内置的 basic mapping types 可以大致地分类为:
1:integer, long, short, float, double, character, byte, boolean, yes_no, true_false
这些类型都对应Java的原始类型或其封装类,来符合特定厂商的SQL 字段类型。
2:boolean,yes_no和true_false
是Java中boolean或者Boolean的另外说法。
3:string
从 java.lang.String 到 VARCHAR(或者 Oracle 的 VARCHAR2)的映射。
4:date, time, timestamp
从java.util.Date和其子类到SQL类型 DATE,TIME 和 TIMESTAMP(或等价类型)的映射。
5:calendar, calendar_date
从java.util.Calendar到SQL类型TIMESTAMP和DATE(或等价类型)的映射。
6:big_decimal, big_integer
从 java.math.BigDecimal 和 java.math.BigInteger 到 NUMERIC(或者 Oracle 的 NUMBER类型)的映射。
7:locale, timezone, currency
从 java.util.Locale,java.util.TimeZone 和 java.util.Currency 到 VARCHAR(或者 Oracle 的VARCHAR2 类型)的映射。Locale 和 Currency 的实例被映射为它们的 ISO 代码。TimeZone 的实例被影射为它的 ID。
8:class
从java.lang.Class 到 VARCHAR(或者 Oracle 的 VARCHAR2 类型)的映射。Class 被映射为它的全限定名。
9:binary
把字节数组(byte arrays)映射为对应的 SQL 二进制类型。
10:text
把长 Java 字符串映射为 SQL 的 CLOB 或者 TEXT 类型。
11:serializable
把可序列化的 Java 类型映射到对应的 SQL 二进制类型。你也可以为一个并非默认为基本类型的可序列化 Java 类或者接口指定 Hibernate 类型 serializable。
12:clob, blob
JDBC 类 java.sql.Clob 和 java.sql.Blob的映射。某些程序可能不适合使用这个类型,因为blob 和 clob 对象可能在一个事务之外是无法重用的。(而且, 驱动程序对这种类型的支持充满着补丁和前后矛盾。)
13:imm_date, imm_time, imm_timestamp, imm_calendar, imm_calendar_date, imm_serializable, imm_binary
一般来说,映射类型被假定为是可变的 Java 类型,只有对不可变 Java 类型,Hibernate 会采取特定的优化措施,应用程序会把这些对象作为不可变对象处理。比如,你不应该对作为 imm_timestamp 映射的 Date 执行 Date.setTime()。要改变属性的值,并且保存这一改变,应用程序必须对这一属性重新设置一个新的(不一样的)对象。
在 org.hibernate.Hibernate 中,定义了基础类型对应的 Type 常量。比如,Hibernate.STRING 代表 string 类型。
ncomposite-id元素
如果表使用联合主键,你可以映射类的多个属性为标识符属性。这种做法现在是非常不推荐的,但可能有些遗留系统使用了双主键或多主键。
配置如下示例:
就表示是一个双主键,由name和deptment联合来做主键
使用Composite-id元素的时候,你的持久化类必须覆盖 equals() 和 hashCode() 方法,来实现组合的标识符的相等判断。实现Serializable 接口也是必须的。
可选的<generator>子元素是一个Java类的名字,用来为该持久化类的实例生成唯一的标识。如果这个生成器实例需要某些配置值或者初始化参数, 用<param>元素来传递。
如下示例:
java代码:
下面是一些Hibernate内置生成器(ID生成策略):
increment
用于为long, short或者int类型生成 唯一标识。只有在没有其他进程往同一张表中插入数据时才能使用。 在集群下不要使用。
identity
对DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL的内置标识字段提供支持。 返回的标识符是long, short 或者int类型的。
Sequence
在DB2,PostgreSQL, Oracle, SAP DB, McKoi中使用sequence, 而在Interbase中使用生成器(generator)。返回的标识符是long, short或int类型的
hilo
使用一个高/低位算法高效的生成long, short 或者 int类型的标识符。给定一个表和字段(默认分别是 hibernate_unique_key 和next_hi)作为高位值的来源。 高/低位算法生成的标识符只在一个特定的数据库中是唯一的。
Seqhilo
使用一个高/低位算法来高效的生成long, short 或者 int类型的标识符,给定一个数据库序列(sequence)的名字。
Uuid
用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。
guid
在MS SQL Server 和 MySQL 中使用数据库生成的GUID字符串
native
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。
Assigned
让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。
select
通过数据库触发器选择一些唯一主键的行并返回主键值来分配一个主键。
foreign
使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用
推荐使用UUID
UUID 包含:IP 地址、JVM 的启动时间(精确到 1/4 秒)、系统时间和一个计数器值(在 JVM 中唯一)。
java代码:
- <property>元素为类定义了一个持久化的,JavaBean风格的属性。
- <property
- name="propertyName" (1)
- column="column_name" (2)
- type="typename" (3)
- update="true|false" (4)
- insert="true|false" (5)
- formula="arbitrary SQL expression" (6)
- access="field|property|ClassName" (7)
- lazy="true|false" (8)
- unique="true|false" (9)
- not-null="true|false" (10)
- optimistic-lock="true|false" (11)
- generated="never|insert|always" (12) />
(1) name: 属性的名字,以小写字母开头
(2) column (可选 - 默认为属性名字): 对应的数据库字段名。也可以通过嵌套的<column>元素指定。
(3) type (可选): 一个Hibernate类型的名字。
typename可以是如下几种:
A:Hibernate基本类型名(比如:integer, string, character,date, timestamp, float, binary, serializable, object, blob)。
B:一个Java类的名字,这个类属于一种默认基础类型 (比如: int, float,char, java.lang.String, java.util.Date, java.lang.Integer, java.sql.Clob)。
C:一个可以序列化的Java类的名字。
D:一个自定义类型的类的名字。(比如:cn.javass.type.MyCustomType)。
如果你没有指定类型,Hibernarte会使用反射来得到这个名字的属性,以此来猜测正确的Hibernate类型。 Hibernate会按照规则B,C,D的顺序对属性读取器(getter方法)的返回类进行解释。然而,这还不够。 在某些情况下你仍然需要type属性。(比如,为了区别Hibernate.DATE 和Hibernate.TIMESTAMP,或者为了指定一个自定义类型。)
(4) update, insert (可选 - 默认为 true) : 表明用于UPDATE 和/或 INSERT 的SQL语句中是否包含这个被映射了的字段。这二者如果都设置为false 则表明这是一个“外源性(derived)”的属性,它的值来源于映射到同一个(或多个) 字段的某些其他属性,或者通过一个trigger(触发器)或其他程序生成。
(5) formula (可选): 一个SQL表达式,定义了这个计算属性的值。计算属性没有和它对应的数据库字段,相当于是一个子查询。
(6) access (可选 – 默认值property): Hibernate访问属性值的策略
access属性用来让你控制Hibernate如何在运行时访问属性。在默认情况下, Hibernate会使用属性的get/set方法对。如果你指明access="field", Hibernate会忽略get/set方法对,直接使用反射来访问成员变量。你也可以指定你自己的策略, 这就需要你自己实现org.hibernate.property.PropertyAccessor接口, 再在access中设置你自定义策略类的名字。
(7) lazy (可选 - 默认为 false): 指定 指定实例变量第一次被访问时,这个属性是否延迟抓取(fetched lazily)( 需要运行时字节码增强)。
(8) unique (可选): 使用DDL为该字段添加唯一的约束。 同样,允许它作为property-ref引用的目标。
(9) not-null (可选): 使用DDL为该字段添加可否为空(nullability)的约束。
(10) optimistic-lock (可选 - 默认为 true): 指定这个属性在做更新时是否需要获得乐观锁定(optimistic lock)。 换句话说,它决定这个属性发生脏数据时版本(version)的值是否增长。
(11) generated (可选 – 默认值never): 表明此属性值是否由数据库生成
<component>元素
<component> 元素把子对象的一些元素与父类对应的表的一些字段映射起来。然后组件可以定义它们自己的属性、组件或者集合。
(1)name:属性名。
(2)class(可选 — 默认为通过反射得到的属性类型):组件(子)类的名字。
(3)insert:被映射的字段是否出现在 SQL 的 INSERT 语句中?
(4)update:被映射的字段是否出现在 SQL 的 UPDATE 语句中?
(5)access(可选 — 默认为 property):Hibernate 用来访问属性值的策略。
(6)lazy(可选 — 默认是 false):表明此组件应在实例变量第一次被访问的时候延迟加载(需要编译时字节码装置器)。
(7)optimistic-lock(可选 — 默认是 true):表明更新此组件是否需要获取乐观锁。换句话说,当这个属性变脏时,是否增加版本号(Version)。
(8)unique(可选 — 默认是 false):表明组件映射的所有字段上都有唯一性约束。
其 <property> 子标签为子类的一些属性与表字段之间建立映射。
组件(Component)是一个被包含的对象,在持久化的过程中,它被当作值类型,
而并非一个实体的引用,指的是对象的合成。使用示例如下:
1:新建一个PersonModel,包含字段:userId和name
2:修改UserModel,在里面去掉userId和name,然后添加一个字段:p,类型为PersonModel,也要对应的getter和setter方法
3:在UserModel.hbm.xml中修改配置如下:
<hibernate-mapping> <class name="cn.javass.h3.hello.UserModel" table="tbl_user"> <id name="uuid"> <generator class="assigned"/> </id> <component name="p" class="cn.javass.h3.hello.PersonModel"> <property name="userId"></property> <property name="name"></property> </component> <property name="age"></property> </class> </hibernate-mapping>
4:相应的修改Client文件如下:
5:运行测试
<join>元素
使用 <join> 元素,假若在表之间存在一对一关联,可以将一个类的属性映射到多张表中。
(1)table:被连接表的名称。
(2)schema(可选):覆盖在根 <hibernate-mapping> 元素中指定的schema名字。
(3)catalog(可选):覆盖在根<hibernate-mapping> 元素中指定的catalog名字。
(4)fetch(可选 — 默认是 join):如果设置为默认值 join,Hibernate 将使用一个内连接来得到这个类或其超类定义的 <join>,而使用一个外连接来得到其子类定义的 <join>。如果设置为 select,则 Hibernate 将为子类定义的 <join> 使用顺序选择。这仅在一行数据表示一个子类的对象的时候才会发生。对这个类和其超类定义的 <join>,依然会使用内连接得到。
(5)inverse(可选 — 默认是 false):如果打开,Hibernate 不会插入或者更新此连接定义的属性。
(6)optional(可选 — 默认是 false):如果打开,Hibernate 只会在此连接定义的属性非空时插入一行数据,并且总是使用一个外连接来得到这些属性。
例如,一个人(person)的地址(address)信息可以被映射到单独的表中(并保留所有属性的值类型语义):
...
此特性常常对遗留数据模型有用
<properties>元素
<properties> 元素允许定义一个命名的逻辑分组(grouping)包含一个类中的多个属性。这个元素最重要的用处是允许多个属性的组合作为 property-ref 的目标(target)。这也是定义多字段唯一约束的一种方便途径。
基本定义如下:
(1)name:分组的逻辑名称 — 不是实际属性的名称。
(2)insert:被映射的字段是否出现在SQL的INSERT语句中
(3)update:被映射的字段是否出现在SQL的UPDATE语句中
(4)optimistic-lock(可选 — 默认是 true):表明更新此组件是否需要获取乐观锁。换句话说,当这个属性变脏时,是否增加版本号(Version)。
(5)unique(可选—默认 false):表明组件映射的所有字段上都有唯一性约束。
<properties>元素的简单示例
<properties name="name" unique="true" update="false">
<property name="firstName"/>
<property name="initial"/>
<property name="lastName"/>
</properties>
在其他元素里面,就可以使用属性参照来引用了,如property-ref="name"
与对象继承相关的配置
鉴别器(discriminator)、子类、连接的子类、联合子类、连接、Any元素
与关系相关的配置
多对一(many-to-one)、一对一(one-to-one)、key映射
与version类似的timestamp
同样用在乐观锁的配置上,作为版本的替代。时间戳本质上是一种对乐观锁定的一种不是特别安全的实现,并不推荐使用。
自然ID(natural-id)
在<natural-id>元素中列出自然键的属性。Hibernate会帮你生成必须的唯一键值和非空约束,但这一映射不是为了把自然键作为主键而准备的。
动态组件(dynamic-component)
类似于Component元素,由Hibernate根据配置进行动态映射Map类型,不推荐。
关于CLOB与BLOB的区别(写得不错)
相关推荐
Hibernate教程01_Hibernate的HelloWorld及基本配置 http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码
这篇教程将深入讲解Hibernate的基本配置过程,确保你能顺利搭建并运行一个简单的Hibernate项目。 **一、Hibernate概述** Hibernate是一个开源的ORM框架,它的主要功能是将Java对象与数据库表进行映射,从而避免了...
#### 二、Hibernate4的基础配置与开发 **2.1 基础配置** - **cfg.xml**:这是Hibernate4的主配置文件,包含了数据库连接信息、日志级别设置等。 - **Mapping配置**:定义实体类与数据库表之间的映射关系。 - **...
在Hibernate4的配置方面,教程会讲解XML配置文件和注解配置的不同方式,以及如何在实际项目中进行配置,包括数据库连接池的设置、实体类的映射等。此外,还会涉及HQL(Hibernate查询语言)和 Criteria API,这两种...
本教程将详细讲解如何在Java项目中配置和使用Hibernate,包括在普通Java工程和Maven工程中的配置实例。 首先,我们需要了解Hibernate的核心概念。Hibernate是一个开源的ORM框架,它可以将Java类与数据库表进行映射...
通过阅读《Hibernate3基础教程中文版》,并结合提供的源码进行实践,你将能够熟练地掌握Hibernate3的基本用法和最佳实践,为你的Java开发生涯添砖加瓦。同时,源码分析将帮助你更好地理解Hibernate在实际项目中的...
【Hibernate教程】 Hibernate 是一个强大的Java对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中操作数据库的强大工具。本教程将深入探讨Hibernate的核心概念、配置、实体映射以及如何通过它来简化...
本教程覆盖了从基本概念到实战案例的多个层次,适合初学者和有一定经验的开发者学习,进一步理解ORM和Hibernate框架的精髓。通过学习,读者应能独立完成基于Hibernate的数据库操作,并能灵活应对各种复杂的关联关系...
本教程将详细解释Hibernate的基本配置和使用步骤,帮助初学者快速掌握这一强大的工具。 ### 一、对象关系映射(O/R Mapping) 1. **O/R Mapping是什么?** 对象关系映射是将Java应用程序中的对象模型与关系数据库...
《Hibernate高级教程》是一份深度探索Java对象关系映射(ORM)框架Hibernate的教程,它包含14个精心设计的章节,旨在帮助开发者深入理解并掌握Hibernate的核心特性和高级用法。以下是对这些章节可能涉及的主要知识点...
### hibernate教程知识点详解 #### 一、概述 本文档主要介绍了使用Hibernate进行注解式开发的方法,并且针对Hibernate的基本使用及其配置进行了详尽的解释。Hibernate作为一个流行的Java持久层框架,提供了对象...
本教程的【第一篇】将介绍Hibernate的基础知识和基本操作,【第二篇】会深入到关联映射和查询,【第三篇】涵盖性能优化和扩展性,而【第四篇】则聚焦于实际项目中的应用和问题解决。通过这四篇内容的学习,你将能够...
### Hibernate3教程知识点详解 #### 一、在Myeclipse中连接MySQL数据库 - **1.1 打开Myeclipse数据库视图** - 此步骤涉及的是启动Myeclipse IDE并找到“数据库视图”窗口。通常情况下,可以在主界面通过视图(View...
本教程的"基础Hibernate 教程.txt"文件,可能包含了关于这些知识点的详细讲解,包括代码示例和实践步骤,帮助初学者快速掌握Hibernate的基本用法。通过学习和实践,开发者可以更高效地进行Java数据库应用的开发。
- 安装与配置:了解如何在项目中集成Hibernate,设置hibernate.cfg.xml配置文件,以及连接数据库的基本信息。 - 实体类与实体映射:理解Hibernate中的Entity,如何创建实体类,并通过注解或XML文件进行实体映射,...
这就是一个基本的使用Maven配置Hibernate5的流程。通过这种方式,你可以轻松地在Java应用中管理和操作数据库。在实际开发中,你可能还需要考虑缓存配置、事务管理、日志等更多细节,但上述步骤已经为你建立了一个...
3. **Hibernate SessionFactory配置**:在Spring配置文件中,我们需要创建SessionFactory Bean,配置数据库连接信息。 4. **事务配置**:使用PlatformTransactionManager配置事务管理器,例如...
【hibernate教程打包下载,史上最全的HIBERNATE】这个资源集合涵盖了广泛的Hibernate相关知识,对于初学者和有经验的Java开发者来说都是一份宝贵的资料。Hibernate是一款优秀的对象关系映射(ORM)框架,它极大地...
《Hibernate 3.2 详细教程及课程笔记》是一份专为Java开发者设计的深入学习指南,旨在帮助已经具备Java基础知识的学习者熟练掌握Hibernate框架,并能够将其应用到实际的项目开发中。本教程覆盖了从基础概念到高级...