Hibernate学习---第三节:映射配置文件详解

1、映射文件,代码如下:

<?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">

<!--
    持久化映射文件(将java对象映射到数据库表)
    default-access="property" 对象属性状态操作方式设置
        property 表示属性需要通过 getter / setter 方法操作(默认)
        field 表示可以不需要通过 getter / setter 方法就可以通过反射的方式操作属性

    package 指定持久化配置文件的中 class 的包路径
    default-lazy="true" 指定持久化配置文件的中 class 延迟加载策略
    default-cascade="none" 指定持久化配置文件的中 class 级联操作策略
-->

<hibernate-mapping package="learn.hibernate.bean" default-access="property" default-cascade="none">

    <!--
     1、name (可选): 持久化类(或者接口)的Java全限定名。 如果这个属性不存在,Hibernate将假定这是一个非POJO的实体映射
     2、table (可选 - 默认是类的非全限定名): 对应的数据库表名,生成DDL时数据表名,如果省略,则名称同持久化类名称
     3、lazy="true" 延长加载(默认); lazy="false" 立即加载
     4、dynamic-insert="true" 没有赋值的属性不会参与新增操作
     5、dynamic-update="true" 没有赋值的属性不会参与更新操作
     6、mutable="false" 表示持久化类不允许更新,但是可以新增和删除
     7、select-before-update="true" 执行之前发起一条 SQL 查询,查看数据是否与表一致,不一致就更新,一致的话不用更新(默认 false)
     8、where 查询的时候附带 where 属性中的条件
     -->
    <class name="Person" table="t_person">
        <!--
        主键  name 属性值对应持久化类的属性名;  column(可选) 属性值表示在数据库生成的字段名
        generator元素中的  class 值表示生成策略
            1)  assigned:主键由外部程序负责生成,在 save() 之前指定。

            2)  hilo:通过hi/lo 算法实现的主键生成机制,需要额外的数据库表或字段提供高位值来源。

            3)  seqhilo:与hilo 类似,通过hi/lo 算法实现的主键生成机制,需要数据库中的 Sequence,适用于支持 Sequence 的数据库,如Oracle。

            4)  increment:主键按数值顺序递增。此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。

            5)  identity:采用数据库提供的主键生成机制。如DB2、SQL Server、MySQL 中的主键生成机制。

            6)  sequence:采用数据库提供的 sequence 机制生成主键。如 Oralce 中的Sequence。

            7)  native:由 Hibernate 根据使用的数据库自行判断采用 identity、hilo、sequence 其中一种作为主键生成方式。

            8)  uuid.hex:由 Hibernate 基于128 位 UUID 算法 生成16 进制数值(编码后以长度32 的字符串表示)作为主键。

            9)  uuid.string:与uuid.hex 类似,只是生成的主键未进行编码(长度16),不能应用在 PostgreSQL 数据库中。

            10) foreign:使用另外一个相关联的对象的标识符作为主键。
         -->
        <id name="id" column="person_id">
            <generator class="native"/>
        </id>

        <!--
        name(可选):对应的java类的属性名称
        column(可选):对应的表中的字段
        type(可选):属性的类型,eg.java.lang.String
        not-null(可选):设置该属性是否为空,为true时表示非空,默认为false
        length(可选):字段的长度限制
         -->
        <property name="name" column="t_name"/>
        <property name="age"/>
        <property name="passwork"/>
        <property name="birthday"/>
        <!-- 指定属性 count 的数据来源于 formula 对应的查询语句, count 在数据库中是没有对应字段的 -->
        <property name="count" formula="(select count(*) from t_person)"/>
    </class>

</hibernate-mapping>

2、根元素:<hibernate-mapping>:

(1)、package:指定一个包前缀,如果在映射文档中没有指定全限定的类名,就使用这个作为包名,如:

<hibernate-mapping package="com.demo.hibernate.beans">

<class name="User" ...>

</hibernate-mapping>

<hibernate-mapping>

<class name="com.demo.hibernate.beans.User" ...>

</hibernate-mapping>

(2)、schema:数据库schema的名称

(3)、catalog:数据库catalog的名称

(4)、default-cascade:默认的级联风格,默认为none

(5)、default-access:Hibernate用来访问属性的策略

(6)、default-lazy:指定了未明确注明lazy属性的Java属性和集合类,Hibernate会采取什么样的默认加载风格,默认为true

(7)、auto-import:指定我们是否可以在查询语言中使用非全限定的类名,默认为true,如果项目中有两个同名的持久化类,则最好在这两个类的对应的映射文件中配置为false

3、<class>定义类:根元素的子元素,用以定义一个持久化类与数据表的映射关系,如下是该元素包含的一些可选的属性

(1)name:持久化类(或者接口)的Java全限定名,如果这个属性不存在,则Hibernate将假定这是一个非POJO的实体映射

(2)table:对应数据库表名

(3)discriminator-value:默认和类名一样,一个用于区分不同的子类的值,在多态行为时使用

(4)mutable:表明该类的实例是可变的或者是不可变的

(5)schema:覆盖根元素<hibernate-mapping>中指定的schema名字

(6)catalog:覆盖根元素<hibernate-mapping>中指定的catalog名字

(7)proxy:指定一个接口,在延迟装载时作为代理使用

(8)dynamic-update:指定用于UPDATE的SQL将会在运行时动态生成,并且只更新那些改变过的字段

(9)dynamic-insert:指定用于INSERT的SQL将会在执行时动态生成,并且只包含那些非空值字段

(10)select-before-update:指定HIbernate除非确定对象真正被修改了(如果该值为true),否则不会执行SQL UPDATE操作。在特定场合(实际上,它只在一个瞬时对象关联到一个新的Session中时执行的update()中生效),这说明Hibernate会在UPDATE之前执行一次额外的SQL SELECT操作,来决定是否应该执行UPDATE

(11)polymorphism:多态,界定是隐式还是显式的多态查询

(12)where:指定定个附加的SQLWHERE条件,在抓取这个类的对象时会增加这个条件

(13)persister:指定一个定制的ClassPersister

(14)batch-size:指定一个用于根据标识符(identifier)抓取实例时使用的‘batch size‘(批次抓取数量)

(15)optimistic-lock:乐观锁定,决定乐观锁定的策略

(16)lazy:通过设置lazy="false",所有的延迟加载(Lazy fetching)功能将未被激活(disabled)

(17)entity-name

(18)check:这是一个SQL表达式,用于为自动生成的schema添加多行(multi-row)约束检查

(19)rowid

(20)subselect

(21)abstract:用于在<union-subclass>的继承结构(hierarchies)中标识抽象超类

4、<id>定义主键:Hibernate使用OID(对象标识符)来标识对象的唯一性,OID是关系数据库中主键在Java对象模型中的等价物,在运行时,Hibernate根据OID来维持Java对象和数据库表中记录的对应关系

(1)name:持久化类的标识属性的名字

(2)type:标识Hibernate类型的名字

(3)column:数据库表的主键这段的名字

(4)unsaved-value:用来标志该实例是刚刚创建的,尚未保存。可以用来区分对象的状态

(5)access:Hibernate用来访问属性值的策略

如果表使用联合主键,那么你可以映射类的多个属性为标识符属性。<composite-id>元素接受<key-property>属性映射和<key-many-to-one>属性映射作为子元素:

以下定义了两个字段作为联合主键:

<composite-id>

<key-property name="username" />

<key-property name="password" />

</composite-id>

5、<generator>设置主键生成方式

该元素的作用是指定主键的生成器,通过一个class属性指定生成器对应的类。(通常与<id>元素结合使用)

<id name="id" column="ID" type="integer">

<generator class="native" />--native是Hibernate主键生成器的实现算法之一,由Hibernate根据底层数据库自行判断采用identity、hilo、sequence其中一种作为主键生成方式。

</id>

Hibernate提供的内置生成器:

(1)assigned:由Java应用程序负责生成标识符。主键由外部程序负责生成,在 save() 之前指定。

(2)hilo:Hibernate分局high/low算法生成标识符

(3)seqhilo:使用一个高/低位算法来高效的生成long,short或者int类型的标识符

(4)increment:由Hibernate自动以递增方式生成,此方式的实现机制为在当前应用实例中维持一个变量,以保存着当前的最大值,之后每次需要生成主键的时候将此值加1作为主键。这种方式可能产生的问题是:不能在集群下使用。

(5)identity:由底层数据库生成标识符。如DB2、SQL Server、MySQL 中的主键生成机制

(6)sequence:Hibernate根据底层数据库的序列生成标识符,这要求底层数据库支持序列

(7)native:根据底层数据库对自动生成标识符的方式,自动选择identity、sequence或hilo。

(8)uuid.hex:Hibernate采用128位的UUID算法生成标识符

(9)uuid.string:UUID被编码成一个16字符长的字符串

(10)foregin:使用另外一个相关联的对象的标识符

(查看:http://blog.csdn.net/martin820303/article/details/7769625)

6、<property>定义属性

用于持久化类的属性与数据库表字段之间的映射,包含如下属性:

(1)name:持久化类的属性名,以小写字母开头

(2)column:数据库表的字段名

(3)type:Hibernate映射类型的名字

(4)update:表明用于UPDATE的SQL语句中是否包含这个被映射的字段,默认为true

(5)insert:表明用于INSERT的SQL语句中是否包含这个被映射是否包含这个被映射的字段,默认为true

(6)formula:一个SQL表达式,定义了这个计算属性的值

(7)access:Hibernate用来访问属性值的策略

(8)lazy:指定实例变量第一次被访问时,这个属性是否延迟抓取,默认为false

(9)unique:使用DDL为该字段添加唯一的约束,此外,这也可以用做property-ref的目标属性

(10)not-null:使用DDL为该字段添加可否为空的约束

(11)optimistic-lock:指定这个属性在进行更新时是否需要获得乐观锁定(换句话说,它决定这个属性发生脏数据时版本version的值是否增长)

access属性用来让你控制Hibernate如何在运行时访问属性。默认情况下,Hibernate会使用属性的get/set方法对。如果你指明access="field",则Hibernate会忽略get/set方法对,直接使用反射来访问成员变量。

formula属性是个特别强大的的特征。这些属性应该定义为只读,属性值在装载时计算生成。用一个SQL表达式生成计算的结果,它会在这个实例转载时翻译成一个SQL查询的SELECT子查询语句。如:

<property name="totalPrice" formula="(SELECT SUM(*) FROM user)" />

(来自:http://blog.163.com/hzd_love/blog/static/13199988120108265317988/)

时间: 2024-11-06 09:03:19

Hibernate学习---第三节:映射配置文件详解的相关文章

Java学习-007-Log4J 日志记录配置文件详解及实例源代码

此文主要讲述在初学 Java 时,常用的 Log4J 日志记录配置文件详解及实例源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源代码测试通过日期为:2015-1-30 13:54:02,请知悉. 所需的 jar 包下载链接为:http://yunpan.cn/cKE56sxqtQCfP  访问密码 63d8 有关 Log4J 日志文件中日志级别及文件配置的详细情况,在 Log4J 的配置文件(xml.properties)中有详细的介绍,敬请参阅!

hibernate学习(2)——api详解对象

1   Configuration 配置对象 /详解Configuration对象 public class Configuration_test { @Test //Configuration 用户加载配置文件 public void fun1(){ //1.1 调用configure() 方法=> 加载src下名为hibernate.cfg.xml Configuration conf = new Configuration().configure(); //1.2 如果配置文件不符合默认加

Ansible自动化运维学习之五:Ansible配置文件详解与调优

一.常用参数详解本文对 https://blog.51cto.com/8355320/2471354 的参数配置进行了扩充.Ansible默认配置文件为/etc/ansible/ansible.cfg,配置文件中可以对ansible进行各项参数的调整,包括并发线程.用户.模块路径.配置优化等,常用参数如下: [defaults] inventory = /etc/ansible/hosts 被控端IP信息列表: library = /usr/share/my_modules/ Ansible默认

hibernate框架学习笔记2:配置文件详解

实体类: package domain; public class Customer { private Long cust_id; private String cust_name; private String cust_source; private String cust_industry; private String cust_level; private String cust_linkman; private String cust_phone; private String c

Mybatis学习记录(三)--Mybatis配置文件详解

关于mybatis的配置文件,主要有两个,一个是SqlMapperConfig.xml文件一个是mapper.xml文件,分别对这两个进行深入全面学习. 一.SqlMapperConfig.xml文件 1.标签概况 在SqlMapperConfig.xml中主要有以下标签,其中环境集合environments和spring整合后废除不用.objectFactory和plugins不经常使用. properties(属性) settings(全局配置参数) typeAliases(类型别名) ty

struts2学习笔记--struts.xml配置文件详解

这一节主要讲解struts2里面的struts.xml的常用标签及作用: 解决乱码问题 <constant name="struts.i18n.encoding" value="utf-8"/> //设置编码格式为utf-8 自定义扩展名 <constant name="struts.action.extension" value="action,,wang"/> //struts默认扩展名是actio

mybatis的mapper映射配置文件详解

一.标签介绍 insert,update,delete,select,sql,resultMap sql:可被其它语句引用的可重用语句块: resultMap:确定实体类属性与表中字段对应关系: 二.namespace的作用 在MyBatis中,Mapper中的namespace用于绑定Dao接口的,即面向接口编程. 它的好处在于当使用了namespace之后就可以不用写接口实现类,业务逻辑会直接通过这个绑定寻找到相对应的SQL语句进行对应的数据处理 三.parametetType属性 在<in

Hibernate配置文件与映射文件详解

Hibernate是一个彻底的ORM(Object Relational Mapping,对象关系映射)开源框架. 我们先看一下官方文档所给出的,Hibernate 体系结构的高层视图: 其中PO=POJO+映射文件 根据体系结构视图可以了解到整个利用Hibernate框架实现的项目包括整个重要的配置文件: Hibernate配置文件:实现Hibernate基础配置,是Hibernate能够友好的与DB进行交互基础: 开发时放置src目录下,取名为:hibernate.cfg.xml(hiber

Hibernate复习(三)配置文件详解

1.hibernate.cfg.xml 2.映射文件Person.hbm.xml Java的实体类是通过配置文件与数据表中的字段相关联.Hibernate在运行时解析配置文件,根据其中的字段名生成相应的SQL语句 a.id属性 <generator>子元素用来设定标识符生成器.Hibernate提供了多种内置的实现. b.property属性 ? name属性:指定持久化类的属性的名字. ? type属性:指定Hibernate或Java映射类型.Hibernate映射类型是Java类型与SQ