【回顾】
本篇博客开始,我们将学习的视线转移到“映射”。
【映射定义(Mapping Declaration)】
对象和关系数据库之间的映射通常是用一个XML文档(XML document)来定义的。这个映射文档被设计为易读的, 并且可以手工修改。映射语言是以Java为中心,这意味着映射文档是按照持久化类的定义来创建的, 而非表的定义。
下面,同样从一个xml文件的代码出发,了解配置中各个标签是怎样的含义,又有着哪些属性。
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.bjpowernode.hibernate">
<!-- table属性重命名;length属性控制字段的长度;access属性持久类中不提供setter方法,则可用field设置 -->
<class name="User1" table="t_user1">
<id name="id" column="user_id" length="32" access="field">
<generator class="uuid"/>
</id>
<property name="name" length="30" unique="true" not-null="true"/>
<property name="password"/>
<property name="createTime" type="date" column="create_time"/>
<property name="expireTime"/>
</class>
</hibernate-mapping>
【标签与属性】
1. hibernate-mapping,此标签的作用是查询到持久化类。
主要属性:
auto-import (可选 - 默认为 true): 指定我们是否可以在查询语言中使用非全限定的类名(仅限于本映射文件中的类)。
package (可选): 指定一个包前缀,如果在映射文档中没有指定全限定的类名, 就使用这个作为包名。
假若有两个持久化类,它们的非全限定名是一样的(就是两个类的名字一样,所在的包不一样),应该设置auto-import="false"。
我们在代码中写hql语句,从某个实体类去查询,是因为其auto-import属性默认为true。它会找到对应package属性值下的实体类。
2. class,此标签主要是定义持久化类。
主要属性:
name (可选): 持久化类(或者接口)的Java全限定名。 如果这个属性不存在,Hibernate将假定这是一个非POJO的实体映射。
table (可选 - 默认是类的非全限定名): 对应的数据库表名,可以使用该属性重命名表名。
dynamic-update (可选, 默认为 false): 指定用于UPDATE 的SQL将会在运行时动态生成,并且只更新那些改变过的字段。设置为true,则每次的update语句都不相同,性能就不会像false那样好。
dynamic-insert (可选, 默认为 false): 指定用于INSERT的 SQL 将会在运行时动态生成,并且只包含那些非空值字段。
lazy (可选): 通过设置lazy="false", 所有的延迟加载(Lazy fetching)功能将被全部禁用(disabled)。
3. id,定义数据库中的主键字段。
主要属性:
name (可选): 标识属性的名字。
type (可选): 标识Hibernate类型,就像数据类型,如设置为date,time等。
column (可选 - 默认为属性名): 主键字段的名字。
access (可选 - 默认为property): Hibernate用来访问属性值的策略。若在持久类中不提供setter方法,则可设置为field。
4. generator,主键生成器。
Hibernate提供了很多内置的实现。下面是一些内置生成器的快捷名字:
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类型的。
uuid,
用一个128-bit的UUID算法生成字符串类型的标识符, 这在一个网络中是唯一的(使用了IP地址)。UUID被编码为一个32位16进制数字的字符串。
native,
根据底层数据库的能力选择identity, sequence 或者hilo中的一个。
assigned,
让应用程序在save()之前为对象分配一个标示符。这是 <generator>元素没有指定时的默认生成策略。
foreign,
使用另外一个相关联的对象的标识符。通常和<one-to-one>联合起来使用。
5. property,映射普通属性。
主要属性:
unique (可选): 使用DDL为该字段添加唯一的约束。 同样,允许它作为property-ref引用的目标。
not-null (可选): 使用DDL为该字段添加可否为空(nullability)的约束。
【总结】
本篇博客的内容主要是关于映射配置中一些基础的标签和属性,知道了这些,将会在代码的运用中起到很大的帮助作用。