Hibernate的映射文件

映射文件的结构和属性

一个映射文件(mapping file)由一个根节点<hibernate-mapping>和多个<class>节点组成,

首先看看根节点<hibernate-mapping>支持什么属性:

1 <hibernate-mapping
2          schema="schemaName"                               (1)
3          catalog="catalogName"                             (2)
4          default-cascade="cascade_style"                   (3)
5          default-access="field|property|ClassName"         (4)
6          default-lazy="true|false"                         (5)
7          auto-import="true|false"                          (6)
8          package="package.name"                            (7)
9  />

这8个属性都是可选的,下面解释几个重要的属性,

default-lazy:延迟加载,默认为true,Hibernate通过默认加载提升性能,通常建议设置为true。在后面的配置属性和集合映射时也可以指定lazy值

auto-import:是否允许查询语句中使用非全限定类名,默认为true,当一个映射文件中有两个持久化类,包名不同,类名相同时,需要设置auto-import为false才能区分。

package:设置该值之后,映射文件就不再需要指定全限定类名

再看看<class>标签支持什么样的属性,

 1 <class
 2         name="ClassName"                                   (1)
 3         table="tableName"                                  (2)
 4         discriminator-value="discriminator_value"          (3)
 5         mutable="true|false"                               (4)
 6         schema="owner"                                     (5)
 7         catalog="catalog"                                  (6)
 8         proxy="ProxyInterface"                             (7)
 9         dynamic-update="true|false"                        (8)
10         dynamic-insert="true|false"                        (9)
11         select-before-update="true|false"                  (10)
12         polymorphism="implicit|explicit"                   (11)
13         where="arbitrary sql where condition"              (12)
14         persister="PersisterClass"                         (13)
15         batch-size="N"                                     (14)
16         optimistic-lock="none|version|dirty|all"           (15)
17         lazy="true|false"                                  (16)
18         entity-name="EntityName"                           (17)
19         check="arbitrary sql check condition"              (18)
20         rowxml:id="rowid"                                  (19)
21         subselect="SQL expression"                         (20)
22         abstract="true|false"                              (21)
23         node="element-name"
24 />

一对<class>就代表一个持久化实体类,即数据库中的表,在<class>元素下,通常还会有<id>和<property>子元素,用来构成表的各个字段,<id>通常用来映射主键,<property>则用来映射普通字段,另外还可以通过<set> <map>等映射集合字段,下面一一讲解。

映射主键(<id...>

Hibernate建议为持久化类定义一个标识属性(identifier property),如private int id, 标识属性映射数据库底层的主键字段(primary key column )。在映射文件中,标识属性用<id>表示,<id>标签支持以下属性:

 1 <id
 2         name="propertyName"                                (1)
 3         type="typename"                                    (2)
 4         column="column_name"                               (3)
 5         unsaved-value="null|any|none|undefined|id_value"   (4)
 6         access="field|property|ClassName">                 (5)
 7         node="element-name|@attribute-name|element/@attribute|."
 8
 9         <generator class="generatorClass"/>
10 </id>

unsaved-value:指定刚创建尚未保存时的标识属性值,用来区分已经加载到session但未再次持久化的实例,Hibernate 3中已经不需要指定这个属性。

上面几个属性通常只需要指定 name, type, column这三个属性,在泛型中,type属性也不需要指定,Hibernate会通过反射获取字段类型

在Hibernate中,提供了一个逻辑主键生成器,在映射文件中通过<id>元素的子元素<generator>表示,可以为每个持久化类生成唯一逻辑主键,

主键生成器<generator>的class属性支持以下值,代表不同种类的主键生成器策略,

1 <generator class="increment|identity|sequence|hilo|seqhilo|uuid|guid|native|assigned|select|foreign" />

其中最常用的identiry,适合DB2,MySQL, MSSQL等支持自增长字段的数据库,可以返回long, short, int等。

sequence,适合DB2,Oracle等。

映射普通属性(<property...>

<property>标签支持以下属性,

 1 <property
 2         name="propertyName"                                (1)
 3         column="column_name"                               (2)
 4         type="typename"                                    (3)
 5         update="true|false"                                (4)
 6         insert="true|false"                                (4)
 7         formula="arbitrary SQL expression"                 (5)
 8         access="field|property|ClassName"                  (6)
 9         lazy="true|false"                                  (7)
10         unique="true|false"                                (8)
11         not-null="true|false"                              (9)
12         optimistic-lock="true|false"                       (10)
13         generated="never|insert|always"                    (11)
14         node="element-name|@attribute-name|element/@attribute|."
15         index="index_name"
16         unique_key="unique_key_id"
17         length="L"
18         precision="P"
19         scale="S"
20 />

通常情况下只需指定name, column, type的值, 另外部分属性解释如下

update和insert:输入属性值不需要Hibernate生成,则指定为false

formula=(sql):直接写SQL获取数据,括号不能少

lazy:是否延迟加载,默认为false

下面演示一下formula的用法,

如果我们在实体类Person.java中有一个普通属性 private String fullContent;

1 private String fullContent;

在映射文件中,这个属性的值是通过formula的方式获取的,则映射文件应该这么写,

1 ...
2 <property name="fullContent" formula="(select concat(p.name,p.age) from person_inf p where p.person_id = person_id)" />
3 ...

这样,我们在测试类中如果要获取这个属性值的话,就会取formula的值

1 Person p = (Person)sess.get(Person.class, 3);
2 System.out.println(p.getFullContent());

上面的例子只是得到一个实体类的属性字段值,但是在数据库层面并没有生成这个字段,

要想数据库也生成这个字段,则要通过<property>标签的generated属性来指定, 例如

1 ...
2 <property name="fullContent" column="full_content" type="string" generated="insert" />
3 ...

同时,需要有一个数据库的触发器配合使用才能实现上面的功能,

 1 drop database test;
 2 create database test;
 3 use test;
 4 create table person_inf
 5 (
 6 id auto_increment primary key,
 7 title varchar(255) not null,
 8 content varchar(255)
 9 full_content varchar(255)
10 );
11 DELEMITER |
12 create trigger t_full_content_gen BEFORE INSERT ON person_inf
13     FOR EACH ROW BEGIN
14         set person_inf.full_content=concat(person_inf.title, person_inf.content);
15     END;
16 |
17 DELIMITER ;

先执行上面的SQL脚本,然后才执行java程序,另外需要将hibernate.cfg.xml的hbm2ddl.auto改为update,避免重建数据库时丢失触发器。

之后,便可以像上面那样访问这个属性了,

1 Person p = (Person)sess.get(Person.class, 3);
2 System.out.println(p.getFullContent());
时间: 2024-08-24 17:24:29

Hibernate的映射文件的相关文章

使用oracle数据库和MySQL数据库时hibernate的映射文件.hbm.xml的不同

如果是使用oracle数据库,那么hibernate的映射文件.hbm.xml如下: <id name="xuehao" column="xuehao"> </id> 这个id不是数据库自动生成的,这需要注意:而且这些字段必须和实体类中相对应,实体类中还需要对应的get()方法和set()方法. 因为oracle数据库中的id都是自动生成的,所以这里不需要写数据库的id,这和MySQL数据库有很大区别:另外,MySQL数据库建表时必须指明id

hibernate 关系映射文件配置

<!--Department.hbm.xml users属性,本类与User的一对多 --> <set name="users"> <key column="departmentId"></key> <one-to-many class="User" /> </set> <!-- parent属性,本类与Department(上级)的多对一 --> <man

Hibernate实体映射文件多对多等关系简单应用技巧

第一步,写注释: <!--xx属性,本类与Yy(类)的多对一 --> <!--xx属性,本类与Yy(类)的一对多 --> <!--xx属性,本类与Yy(类)的多对多 --> <!--xx属性,本类与Yy(类)的一对一 --> 第二部,拷模版 <!--xx属性,本类与Yy(类)的多对一 --> <many-to-one name="" class="" column="">&l

hibernate之映射文件VS映射注解

前言 对于java开发者而言,注解应该不是一个陌生的概念,早在JavaSE阶段,例如@Override标记重写父类方法或实现接口方法,@Test标记单元测试方法,所以我们可以简单地把它理解为一种有特殊含义的标记...在开发过程中,我们还可以用注解方式替代配置文件实现相关功能,例如Java web开发中,3.0版本后,利用@WebServlet.@WebListener等注解分别可以替代web项目XML配置文件中相关内容.而本文中讲述的就是Hibernate的映射配置文件与映射注解的对比,这两种方

Hibernate的映射文件配置

对象关系的映射是用一个XML文档来说明的.映射文档可以使用工具来生成,如XDoclet,Middlegen和AndroMDA等.下面从一个映射的例子开始讲解映射元素,映射文件的代码如下: <?xml version="1.0"?> <!-- 所有的XML映射文件都需要定义如下所示的DOCTYPE. Hibernate会先在它的类路径(classptah)中搜索DTD文件. --> <!DOCTYPE hibernate-mapping PUBLIC &qu

Hibernate hbm映射文件的详解

错误演示 第一步:导入jar包   省略 第二部:创建Person类 package cn.hibernate.bean; import java.util.Date; public class Person { private Integer pId; private String pName; private int age; private Date brithdayDate; private boolean gender; private byte[] photo; private St

myeclipse中hibernate生成映射文件

在hibernate中,每个数据表对应的其实是一个实体类,每个实体类有一个对应的hbm.xml配置文件匹配,myeclipse中有个MyEclipse Database Explorer视图,它提供了myeclipse与数据库直接连接的内置窗口,并且通过此窗口可以生成hibernate的mapping文件 前提是:已经新建了一个web工程并且已经通过myeclipse添加了hibernate框架. 一.MyEclipse Database Explorer 建立数据库连接 二,到MyEclips

hibernate 的映射文件快速生成:使用CodeSmith快速生成映射文件和映射类

一 CodeSmith简介 本文以表自动生成NHibernate的映射文件和映射类的实例来说明一下本软件的使用方法. CodeSmith是一种基于模板的代码生成工具,其使用类似于ASP.NET的语法来生成任意类型的代码和文件.使用 CodeSmith,可以生成包括简单的强类型集合和完整应用程序在内的任何东西.(弱类型-没有明显的类型,会随着环境的不同自动变换类型:强类型-在声明时规定其数据类型,保证类的安全,虽然系统也有一定的默认转换,但是没有弱类型那么随便) 当您生成应用程序时,您经常需要重复

hibernate基本映射文件

<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> <hibernate-mapping package="com.fengye.hibern