02.Hibernate映射基础
前言:Hibernate的核心功能是根据数据库到实体类的映射,自动从数据库绑定数据到实体类。使我们操作实体类(Java对象)就能对数据库进行增、删、查、改,而不用调用JDBC API使数据操作变得简单而不繁琐。本文就主要讲解Hibernate的映射文件的映射机制,但本文讲解的重点在于通过Hibernate如何配置实体类到数据库表的映射,至于数据库表(或实体类)之间的各种关联关系的映射会在后面的文章中讲到。
1.映射配置文件基础(XXX.hbm.xml)
<?xml version='1.0' encoding='utf-8'?><!DOCTYPE hibernate-mapping PUBLIC"-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"><hibernate-mapping package="model" default-lazy="true" default-access="property" default-cascade="none"><class name="Teacher" table="tb_teacher" dynamic-insert="true" dynamic-update="true" lazy="true"><id name="id" column="id" type="long"><generator class="native"></generator></id><property name="no" column="no" type="string" not-null="true"/><property name="name" column="name" type="string" access="field"/><property name="sex" column="sex" type="string" update="true"/><property name="job_title" column="job_title" type="string" insert="true"/></class></hibernate-mapping>
- 映射配置文件配置文件的作用是:用来确定持久化类与数据库表的关系。
- 命名规则与存放位置:映射文件的命名可以任意只是文件后缀是.xml,也可以多个持久化类使用同一个映射文件。但是为了便于维护和项目的可读性,一般为每个持久化类些单独的映射文件,并使用XXX.hbm.xml的形式来命名,“XXX”既是持久化类名,并且持久化类与其映射文件放在同一目录下。
<hibernate-mappingschema="dbo"catalog="shopping"default-cascade="none|all|save-update|delete"default-access="property|field|ClassName"default-lazy="true|false"auto-import="true|false"package="package.name">
- schema:数据库schema。
- catalog:数据库catalog。
- default-cascade:默认级联模式,为hibernate-mapping节点下的所有class节点设置默认的级联操作,默认是none。
- default-access:默认的实体类属性访问模式,取值为property表示访问getter、setter方法间接访问实体类字段,取值为field表示直接访问实体类字段(类成员变量)。
- default-lazy:默认检索模式,为hibernate-mapping节点下的所有class节点设置默认的检索模式,默认是true,即使用懒加载。
- auto-import:在查询语言中是否可以使用不包含包名的类名,为true时表示可以在HQL中只使用类名,为false时表示在HQL必须使用类全路径名。
- package:设置映射文件class中节点默认的包名称,配置了这个属性,那么在class节点中的name属性就只需指定类名就可以了,不用再写类全名。
<classname="EntityClassName"table="TableName"dynamic-insert="false|true"dynamic-update="false|true"lazy="false|true"optimistic-lock="version"mutable="false|true"select-before-update="false|true"batch-size="5"subselect="SQL expression"where="arbitrary sql where condition"check="arbitrary sql check condition"persister="PersisterClass"schema="schema"catalog="catalog"entity-name="EntityName"proxy="ProxyInterface"polymorphism="implicit"abstract="false|true"discriminator-value="discriminator-value"rowid="rowid"node="element-name">
- name:实体类名,默认要写类全名,若配置了hibernate-mapping节点的package属性则可以只写类名。
- table:此实体类对应的数据库表名。
- dynamic-insert:保存当前实体类时是否动态的产生insert语句,推荐使用true。
- dynamic-update:当更新实体类时是否动态的产生update语句,推荐使用true。
- lazy:是否使用懒加载检索策略,默认true。
- optimistic-lock:乐观锁定,默认是version:。决定乐观锁定的策略。
- mutable:类是否会发生改变,如果类实例对应的数据库表记录不会发生更新,可将其设为false,适用于单纯的Insert操作不使用update操作。
- select-before-update:是否在执行update前执行一下select以确定对象真的改变了才执行update。
- batch-size:用于设置批次操作的SQL语句的数量,默认为1。
- subselect:一个SQL子查询,它将一个不可变并且只读的实体映射到一个数据库的子查询。
- where:一个SQL查询的where条件,查询这个类的对象时会一直增加这个条件。
- check:这是一个SQL表达式,用于为自动生成的schema添加多行约束检查。
- persister:指定持久化实现类,通过指定持久化类,我们可以实现自定义的持久化方法。持久化类为ClassPersister接口的实现
- schema:数据库schema。
- catalog:数据库catalog。
- entity-name:Hibernate3新增特性,用于动态模型(Dynamic Model)支持。Hibernate3允许一个类进行多次映射(前提是映射到不同的表)。
- proxy:指定一个接口,在延迟装载时作为代理使用。
- polymorphism:界定是隐式还是显式的使用多态查询,默认值为implicit(隐式)。
- abstract:是否是抽象类配置(对应的实体类不一定是抽象的,只是配置是抽象的)
- discriminator-value:一个用于区分不同的子类的值,在多态行为时使用,默认和类名一样。
- rowid:Hibernate可以使用数据库支持的所谓的ROWID,如:Oracle数据库,如果你设置这个可选的rowid,Hibernate可以使用额外的字段rowid实现快速更新。
- node:配置说明。
<id name="PropertyName"column="TableColumn"type="TypeName"length="ColumnLength"access="field|property|ClassName"unsaved-value="null|any|none|undefined|id_value"node="element-name"><generator class="native"></generator></id>
- name:实体类属性名,用做数据库表主键的成员变量。
- column:数据库主键字段。
- type:数据库字段类型。
- length:数据库字段长度。
- access:默认的实体类属性访问模式,取值为property表示访问getter、setter方法间接访问实体类字段,取值为field表示直接访问实体类字段(类成员变量)。
- unsaved-value:一个特定的标识属性值,用来标志该实例是刚刚创建的,尚未保存。
- node:配置说明。
- <generator class="native"></generator>:用于设置主键的生成策略。
- <generator class="native"></generator>
- increment:适用于代理主键,由Hibernate自动以递增的方式生成标识符,每次增量为1。ID必须为long、int、short类型。
- identity:适用于代理主键,由底层数据库生成标识符,前提条件是底层数据库支持自动增长的字段类型,例如:DB2、MySQL、MS SQLServer、Sybase等。OID必须是long、int、short类型。
- sequence:适用于代理主键,Hibernate根据底层数据库的序列来生成标识符,前提条件是底层数据库支持序列,例如DB2、Oracle等。OID必须是long、int、short类型。
- hilo:适用于代理主键,Hibernate根据high/low算法来生成标识符。OID必须是long、int、short类型;high/low算法生成的标识符只能在一个数据库中保证唯一。
- native:适用于代理主键,根据底层数据库对自动生成标识符的支持能力,来选择identity、sequence或hilo。OID必须是long、int、short类型。
- uuid.hex:适用于代理主键,Hibernate采用128位的UUID算法来生成标识符,UUID能在网络环境下生成唯一的字符串标识符。
- assigned:适用于自然主键,由Java应用程序负责生成标识符,为了能让Java应用程序设置OID,不能把setID()方法申明为private类型。
- select:适用于遗留数据库中的代理主键或自然主键,由数据库中的触发器来生成标识符。
- foreign:用另一个关联对象的标识符来作为当前对象的标识符,主要用于一对一的关联场合。
- MySQL:increment、identity、hilo、native
- MS SQL Server:increment、identity、hilo、native
- Oracle:sequence、seqhilo、hilo、increment、native
- 跨平台开发:native
<property name="PropertyName"column="TableColumn"type="ColumnType"length="ColumnLength"unique-key="unique-key"unique="true|false"not-null="true|false"insert="true|false"update="true|false"lazy="true|false"access="field|property|ClassName"formula="arbitrary SQL expression"generated="never|insert|always"index="index_name"optimistic-lock="true"precision="10"scale="6"node="element-name">
- name:实体类属性名。
- column:对应的数据库字段名。
- type:数据库字段类型。
- length:数据库字段长度。
- unique-key:为此字段创建唯一约束,属性值即为数据库唯一约束名,只影响自动生成的schema脚本。
- unique:字段是否唯一。
- not-null:字段能否为空。
- insert:在insert时是否含有此字段。
- update:在update时是否含有此字段。
- lazy:是否采用延迟加载策略。
- access:默认的实体类属性访问模式,取值为property表示访问getter、setter方法间接访问实体类字段,取值为field表示直接访问实体类字段(类成员变量)。
- formula:一个SQL表达式,定义了这个计算属性的值,计算属性没有和它对应的数据库字段。
- generated:设置此属性值是否由数据库生成的。
- index:为此字段创建索引,属性值即为数据库索引名,只影响自动生成的schema脚本。
- optimistic-lock:指定这个属性在做更新时是否需要获得乐观锁定,默认为true。
- precision:用于设置数字类型数据的有效数字位数。
- scale:用于设置数字类型数据的小数位数。
- node:配置说明。
<hibernate-configuration><session-factory><!-- 设置实体类到数据库的映射文件 --><mapping resource="org/hbm/Teacher.txt"/></session-factory></hibernate-configuration>
2.实体类属性到数据库表字段映射详解
package model;public class People{private String firstName;private String lastName;private String sex;/** 数据处理 */public String getName(){return firstName + " " + lastName;}/** 数据验证 */public void setSex(String sex){if("男".equals(sex) || "女".equals(sex)){this.sex = sex;}}//其他省略...}
<hibernate-mapping package="model"><class name="People" table="tb_people"><!-- 省略其他 --><property name="name" column="name" type="string" access="property"/><property name="sex" column="sex" type="string" access="property"/></class></hibernate-mapping>
<property name="avgAge" formula="select avg(age) from tb_people"/>
select name,sex ...,( select avg(age) from tb_people ) as avgAge from tb_people where id=1
- class元素dynamic-insert:保存当前实体类时是否动态的产生insert语句,推荐使用true。
- class元素dynamic-update:当更新实体类时是否动态的产生update语句,推荐使用true。
- class元素mutable:类是否会发生改变,如果类实例对应的数据库表记录不会发生更新,可将其设为false,适用于单纯的Insert操作不使用update操作。
- property元素insert:在insert时是否含有此字段。
- property元素update:在update时是否含有此字段。
<property name="homeAddress" column="'Home Address'" type="string"/>
3.实体类属性映射的命名策略
<class name="People"><!-- 默认 table="People" --><id name="id"><!-- 默认 column="id" --><generator class="native"></generator></id><property name="name"/><!-- 默认 column="name" --><property name="sex"/><!-- 默认 column="sex" --></class>
- org.hibernate.cfg.DefaultNamingStrategy
- org.hibernate.cfg.ImprovedNamingStrategy
- classToTableName(String className)方法:如果class元素没有显示设置表名,Hibernate调用该方法生成默认的表名。
- tableName(String tableName)方法:如果class元素显示设置了表名,Hibernate调用该方法生成命名约定的表名。
- propertyToColumnName(String propertyName)方法:如果property元素没有显示设置字段名,Hibernate调用该方法生成默认的字段名。
- columnName(String columnName)方法:如果property元素显示设置了字段名,Hibernate调用该方法生成命名约定的字段名。
4.主键映射
<id name="id"><meta attribute="scope-set">private</meta><generator class="increment"></generator></id><id name="id"><meta attribute="scope-set">private</meta><generator class="identity"></generator></id><id name="id"><meta attribute="scope-set">private</meta><generator class="sequence"><param name="sequence">sequence_name</param></generator></id><id name="id"><meta attribute="scope-set">private</meta><generator class="hilo"><param name="table">hi_value</param><param name="cloumn">next_value</param><param name="max_lo">100</param></generator></id><id name="id"><meta attribute="scope-set">private</meta><generator class="native"></generator></id>
<composite-id><key-property name="name" column="name"/><key-property name="address" column="address"/></composite-id>
public class KeyUtils implements org.hibernate.id.IdentifierGenerator, org.hibernate.id.Configurable{private String formatDateString;@Overridepublic void configure(Type type, Properties params, Dialect d) throws MappingException{formatDateString = params.getProperty("formatDateString");if(formatDateString.length() < 14){formatDateString="yyyyMMddhhmmss";}}@Overridepublic Serializable generate(SessionImplementor session, Object object) throws HibernateException{Date today = new Date();SimpleDateFormat formatDate = new SimpleDateFormat(formatDateString);String time = formatDate.format(today);return time;}}
<id name="id" column="id"><generator class="org.KeyUtils"><param name="formatDateString">yyyyMMddhhmmss</param></generator></id>
02.Hibernate映射基础的更多相关文章
- (转)Hibernate框架基础——一对多关联关系映射
http://blog.csdn.net/yerenyuan_pku/article/details/52746413 上一篇文章Hibernate框架基础——映射集合属性详细讲解的是值类型的集合(即 ...
- (转)Hibernate框架基础——映射主键属性
http://blog.csdn.net/yerenyuan_pku/article/details/52740744 本文我们学习映射文件中的主键属性,废话不多说,直接开干. 我们首先在cn.itc ...
- hibernate Java 时间和日期类型的 Hibernate 映射
基础知识: 在 Java 中, 代表时间和日期的类型包含: java.util.Date 和 java.util.Calendar. 此外, 在 JDBC API 中还提供了 3 个扩展了 java. ...
- Hibernate框架基础
Hibernate框架基础 Hibernate框架 ORM概念 O, Object 对象 R, Realtion 关系 (关系型数据库: MySQL, Oracle…) M,Mapping 映射 OR ...
- Java学习笔记(十三)——通过Netbeans开发环境生成oracle数据库中表的对应hibernate映射文件
[前面的话] 身体慢慢已经快好了,感觉真好,哈哈. 这篇文章要通过Hibernate对数据库进行操作,而Netbeans可以直接通过数据库逆向生成对应的映射文件.基础文章,选择性阅读. [步骤] 1. ...
- NHibernate 映射基础(第三篇) 简单映射、联合主键
NHibernate 映射基础(第三篇) 简单映射.联合主键 NHibernate完全靠配置文件获取其所需的一切信息,其中映射文件,是其获取数据库与C#程序关系的所有信息来源. 一.简单映射 下面先来 ...
- 【SSH进阶之路】Hibernate映射——多对多关联映射(八)
上篇博文[SSH进阶之路]Hibernate映射——一对多关联映射(七),我们介绍了一对多关联映射,它是多对多关联映射的基础. 多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接 ...
- Java进阶知识03 Hibernate的基础配置详解
1.Hibernate的原理/流程步骤 1.通过Configuration().configure(); 读取并解析hibernate.cfg.xml配置文件,并创建一个configuration对象 ...
- Hibernate映射文件详解(News***.hbm.xml)一
Hibernate是一个彻底的ORM(Object Relational Mapping,对象关系映射)开源框架. 我们先看一下官方文档所给出的,Hibernate 体系结构的高层视图: 其中PO=P ...
随机推荐
- php final static const成员属性用法
http://www.111cn.net/phper/php/38976.htm 首先来说说final 1.final不能用来修饰成员属性 2.final只能修饰类和方法 作用:被修饰的类不能被子类所 ...
- Android系统四层架构分享
Android系统四层架构 个人网站:http://www.51pansou.com Android视频下载:Android视频 Android源码下载:Android源码 如果把Android系统看 ...
- 仿酒仙网的一款jQuery侧栏弹出导航栏特效
仿酒仙网的一款jQuery侧栏弹出导航栏特效 一款常用于商城左侧商品导航的jquery菜单导航特效. 非常不错的一款商品分类特效.大家可以拿去研究研究 . 注意:该特效还支持挨千刀的IE6啊,之强大. ...
- input中如何输入逆写的中文句子
<input style="text-align:right" /><input type="text" dir="rtl" ...
- 个人代码管理--svn
通常开发中遇到自己电脑和公司电脑代码共享的问题.比如一些通用的库,图片等项目中基本通用. 一些项目库如google code, github内地访问又挺困难的,常常无法连接,或者慢死..还有就是必须开 ...
- Python脚本控制的WebDriver 常用操作 <四> 设置浏览器大小
下面将使用webdriver来控制浏览器窗口的大小 测试用例场景 设置浏览器窗口的大小有下面两个比较常见的用途: 在统一的浏览器大小下运行用例,可以比较容易的跟一些基于图像比对的工具进行结合,提升测试 ...
- mac ulimit
sudo sysctl -w kern.maxfilesperproc=1048576ulimit -n 1048576
- C# 编译JS -Evaluator
忘记哪里转过来的,自己mark一下 //// <summary> /// 动态求值 /// </summary> public class Evaluator { /// &l ...
- 如何在Eclipse中配置Tomcat
1.Eclipse EE 配置Tomcat Eclipse EE 主要用于Java Web开发和J2EE项目开发.Eclipse EE中配置Tomcat比较简单,新建一个Tomcat Server即可 ...
- 文件系统 第八次迭代 VFS相关说明
麻烦访问evernote链接 http://www.evernote.com/shard/s133/sh/53e5b5ac-1192-4910-8bd5-6886218562af/59516c32a5 ...