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-mapping
schema="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属性就只需指定类名就可以了,不用再写类全名。
<class
name="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;
@Override
public void configure(Type type, Properties params, Dialect d) throws MappingException
{
formatDateString = params.getProperty("formatDateString");
if(formatDateString.length() < 14)
{
formatDateString="yyyyMMddhhmmss";
}
}
@Override
public 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 ...
随机推荐
- 软件工程 speedsnail 冲刺1
2015-5-5 完成任务:背景音乐的添加: 遇到问题:循环播放的设置: 明日任务:snail的移动功能.
- PHP高级笔记汇总
一.PHP日期 PHP的date()函数用于格式化时间或日期.PHP Date()函数可把时间戳格式化为可读性更好的日期和时间.语法:date(format,timestamp)format:必需.规 ...
- Sublime Text 2 安装与使用SFTP插件
http://wbond.net/sublime_packages/sftp/usage http://www.360doc.com/content/13/0603/15/9437165_290170 ...
- shopnc二次开发(一)
---恢复内容开始--- 以前没有怎么接触过shopnc,感觉界面挺漂亮的,不过后来自己需要开发一个电商系统,就顺便参考了下,感觉构架垃圾的一塌糊涂.不过平时做这个系统二次开发的业务比较多,所以简单的 ...
- Mongodb初学习--安装、试用
MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. 在MongoDB中数据被分组存储在数据集中,被称为一个集合(Collection ...
- python的egg包的安装和制作]
Defining Python Source Code Encodings Python egg 的安装 egg文件制作与安装 2011-06-10 14:22:50| 分类: python | ...
- build a git repo and clone
First machine: git init --bare gitrepo.git Second machine: git clone user@server:~/gitrepo.git cd gi ...
- [笔记]--Ubuntu安装Sublime Text 2
sublime text 2 有两种安装方式,一种是添加软件源,然后用命令安装.另外一种是下载安装包.解压手动安装.Sublime Text 2 入门及技巧 一.下载安装 1.在Sublime Tex ...
- this的使用方法
当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是this.this是指向对象本身的一个指针.this只和特定的对象关联,而不和类关联,同一个类的不同对 ...
- C,C++容易被忽略的问题
1.字符串数组,字符串指针可以直接输出 ]="I am a student"; cout<<s2<<endl; char *p="I am a s ...