Hibernate入门到开发(三)详解映射配置文件

来源:互联网 发布:睡美人与魔纺锤 淘宝 编辑:程序博客网 时间:2024/05/18 11:26

一、映射文件知识
1、映射配置文件名称和位置没有固定要求,但是习惯上,映射文件跟实体类放在一起。起名为 “Entity.hbm.xml”
2、映射配置文件中,主要了解三个标签:

a)class:用来建立类与表的映射
        1.name属性:实体类全路径
        2.table属性:数据库表名称
        3.catalog属性:指定数据库名称,可以省略。建议不写
b)hibernate-mapping
        1.package属性:引入实体类的包路径,下面写实体就不需要写类全路径,直接写类名即可
c)id:用来建立类中属性与表中的主键字段对象
        1.name属性:类中的属性名【记住映射文件中所有的name都是指类中的属性】
        2.column属性:映射到表中的列名。如果你的列名跟字段名是一样的,可以不写
        3.length属性:字段的长度
        4.type属性:写java数据类型。设置生成表字段的类型,如果不写自动对应类型
d)property :用来建立普通属性跟数据库之间的关系
        1. name属性:类中的属性名【记住映射文件中所有的name都是指类中的属性】
        2. column属性:映射到表中的列名。如果你的列名跟字段名是一样的,可以不写
        3. length属性:字段的长度
        4. type属性:写java数据类型。设置生成表字段的类型,如果不写自动对应类型

二、稍微完整的映射文件
1、写好映射文件

<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"        "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- package: 引入实体类的包路径,下面写实体就不需要写类全路径,直接写类名即可     如果不写该属性的话:那么class的name应该写成:name="com.hibernate.entity.User"--><hibernate-mapping package="com.hibernate.entity">    <!--         1 配置类和表对应             class标签:用来建立类与表的映射                1.name属性:实体类全路径                2.table属性:数据库表名称                3.catalog属性:指定数据库名称,可以省略。建议不写    -->    <class name="User" table="user">        <!-- 2 配置实体类id和表id对应                 hibernate要求实体类有一个属性唯一值                hibernate要求表有字段作为唯一值        -->        <!-- id标签            1.name属性:实体类里面id属性名称            2.column属性:映射到表中的列名。如果你的列名跟字段名是一样的,可以不写            3.length属性:字段的长度            4.type属性:写java数据类型。设置生成表字段的类型,如果不写自动对应类型         -->        <id name="id" column="id" type="java.lang.Long">            <!-- 设置数据库表id增长策略                 assigned:assigned方式由用户生成主键值,并且要在save()之前指定否则会抛出异常                 Hilo:使用高低位算法生成主键,高低位算法使用一个高位值和一个低位值                    ,然后把算法得到的两个值拼接起来作为数据库中的唯一主键。                increment:对主键值采取自动增长的方式生成新的主键值                identity:主键自增长                sequence:队列的自增长                uuid:自动生成主键,32位长度。                native:会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式            注意:这里建议使用identity sequence native uuid四个                自增长:最推荐使用native,因为他会根据数据库自动选择                identity:mysql支持,orcle不支持                sequence:orcle的自增长                increment:效率太低了            -->            <generator class="native"></generator>        </id>        <!-- 配置其他属性和表字段对应             property标签 :                1.  name属性:类中的属性名【记住映射文件中所有的name都是指类中的属性】                2.  column属性:映射到表中的列名。如果你的列名跟字段名是一样的,可以不写                3.  length属性:字段的长度                4.  type属性:写java数据类型。设置生成表字段的类型,如果不写自动对应类型            建议:类型可以不写,它会自动匹配的        -->        <property name="username" column="username" length="25" type="java.lang.Long"></property>        <property name="password" column="password" length="25" type="java.lang.Long"></property>        <property name="registerTime" column="registerTime" type="java.util.Date"></property>        <property name="number" column="number" type="java.lang.Integer"></property>    </class></hibernate-mapping>

2、在核心配置文件中引入该配置文件

//resource指的是:映射文件的全路径<mapping resource="com/hibernate/entity/User.hbm.xml" />

3、然后就可以写测试案例了。具体跟入门案例一样

 @Test    public void testAll() {        //1:加载配置文件,然后获得SessionFactory工厂        SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();        //解释:这里只要能够去加载我们的配置文件,那么它就会自动加载映射文件,会自动建表。测试是否建表成功    }
    <!--如果你使用的是最新版本的话,5.2以上版本的话,使用新的方式去加载配置文件,获取SessionFactory -->    @Test    public void testHbm() {        StandardServiceRegistry registry = new  StandardServiceRegistryBuilder()                                            .configure()                                             .build();        SessionFactory sessionFactory = new MetadataSources(registry).buildMetadata().buildSessionFactory();    }

这里写图片描述
4、然后在Console可以看到创建表的sql语句,查看数据库
这里写图片描述
5、至此我们就学会了映射文件,这时候去看前面的入门案例,就完全是看得懂了
二、主键的生成策略

Assigned
         Assigned方式由用户生成主键值,并且要在save()之前指定否则会抛出异常
         特点:主键的生成值完全由用户决定,与底层数据库无关。用户需要维护主键值,在调用session.save()之前要指定主键值。
Hilo
         Hilo使用高低位算法生成主键,高低位算法使用一个高位值和一个低位值,然后把算法得到的两个值拼接起来作为数据库中的唯一主键。Hilo方式需要额外的数据库表和字段提供高位值来源。默认情况下使用的表是
hibernate_unique_key,默认字段叫作next_hi。next_hi必须有一条记录否则会出现错误。
         特点:需要额外的数据库表的支持,能保证同一个数据库中主键的唯一性,但不能保证多个数据库之间主键的唯一性。Hilo主键生成方式由Hibernate 维护,所以Hilo方式与底层数据库无关,但不应该手动修改hi/lo算法使用的表的值,否则会引起主键重复的异常。
Increment
         Increment方式对主键值采取自动增长的方式生成新的主键值,但要求底层数据库的主键类型为long,int等数值型。主键按数值顺序递增,增量为1。
         特点:由Hibernate本身维护,适用于所有的数据库,不适合多进程并发更新数据库,适合单一进程访问数据库。不能用于群集环境。
Identity (重要)
         Identity方式根据底层数据库,来支持自动增长,不同的数据库用不同的主键增长方式。
         特点:与底层数据库有关,要求数据库支持Identity,如MySQl中是auto_increment, SQL Server 中是Identity,支持的数据库有MySql、SQL Server、DB2、Sybase和HypersonicSQL。 Identity无需Hibernate和用户的干涉,使用较为方便,但不便于在不同的数据库之间移植程序。
Sequence (重要)
         Sequence需要底层数据库支持Sequence方式,例如Oracle数据库等
         特点:需要底层数据库的支持序列,支持序列的数据库有DB2、PostgreSql、Oracle、SAPDb等在不同数据库之间移植程序,特别从支持序列的数据库移植到不支持序列的数据库需要修改配置文件。
Native
         Native主键生成方式会根据不同的底层数据库自动选择Identity、Sequence、Hilo主键生成方式
         特点:根据不同的底层数据库采用不同的主键生成方式。由于Hibernate会根据底层数据库采用不同的映射方式,因此便于程序移植,项目中如果用到多个数据库时,可以使用这种方式。
UUID (重要)
         UUID使用128位UUID算法生成主键,能够保证网络环境下的主键唯一性,也就能够保证在不同数据库及不同服务器下主键的唯一性。
         特点:能够保证数据库中的主键唯一性,生成的主键占用比较多的存贮空间
Foreign GUID
         Foreign用于一对一关系中。GUID主键生成方式使用了一种特殊算法,保证生成主键的唯一性,支持SQL Server和MySQL

三、总结:重要的就是那么四个:Sequence 、Identity 、Native 、UUID
这里写图片描述

原创粉丝点击