zoukankan      html  css  js  c++  java
  • Hibernate中hibernate.cfg.xml文件和Xxx.hbm.xml文件的详细解释(二)

    勿以恶小而为之,勿以善小而不为--------------------------刘备
    劝诸君,多行善事积福报,莫作恶

    上一章简单介绍了Hibernate开发环境的简单搭建及常见错误(一),如果没有看过,请观看上一章


    Hibernate项目中,有两个特别重要的约束文件,hibernate.cfg.xml和Xxx.hbm.xml文件( 如User.hbm.xml,Person.hbm.xml文件)。

    其中hiberante.cfg.xml是Hiberante的配置文件,cfg为config的简写。这个文件必须要放在src目录下面。
    名称必须是hibernate.cfg.xml, 注意区分大小写。

    接下来,老蝴蝶以上一章节的 User.hbm.xml 和 hibernate.cfg.xml 进行分析。

    一. User.hbm.xml 约束文件

    User.hibernate.xml约束文件是实体约束,最好要与其相对应的Java实体类保持一致。

    如实体类为User,在pojo包下。则xml约束文件也要在pojo包下。

    实体类名称为User,则xml的名称为User.hbm.xml。 hibernate.xml是Hibernate本身自己定义标记的。

    一.一 dtd约束

    <!DOCTYPE hibernate-mapping PUBLIC
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    

    一.二 根节点

    User.hibernate.xml约束的根节点为: hibernate-mapping。 其中有一个主要的节点, package。

    package表示包,指出类所在的路径为 com.yjl.pojo。

    如果不指定这一个,那么下面所有的类都要用全限定名称,即class="com.yjl.pojo.User", 而不能用class="User" 即可。

    <hibernate-mapping package="com.yjl.pojo" >
    </hibernate-mapping>
    

    一.三 类节点

    类节点为class. 里面有三个主要的属性。 name, 表示的为哪个类,即要映射的是哪一个类,里面填写的是类名。

    如果在hibernate-mapping节点中没有指定package,那么这个时候要写入全限定名称,即name="com.yjl.pojo.User",

    如果指定了package,那么这里只需要写入name="User" 即可。 package与name的值共同构成了全限定名称。

    table,表示生成后的表名。Hiberante可以自动建表,table指定建立表时的名称。 lazy,表示懒加载。默认为true.

    懒加载的具体使用,老蝴蝶后面会讲。

    <class name="User" table="user" lazy="true">
    
    </class>
    

    一.四 id属性标签

    在每一个POJO中,都要有一个具体的标识符,这个标识符可以唯一确定对象,也就是数据库中的主键。

    这个主键通常使用的是虚拟主键,不是真实的主键。虚拟主键,通常没有什么意义,只是表示不重复。

    如学生表中,学生的学号是不能重复的,但是却最好不要将其当成主键。(学号表示真实主键),而应该设置一个虚拟的主键,为id. 为自动增长的。 这个id就表示虚拟主键。

    主键生成策略有: 适用于自增长的increment。 用于int,long,short三种类型。 适用于Oracle数据库的序列 sequence.

    还有根据底层数据库选择的 native, 不可重复的uuid。

    在这里插入图片描述

    常见使用的是, native和uuid。

    虚拟主键,自增长的用native. 常用于数字,这个数字只是起一个不重复的作用。 uuid生成唯一标识的,这个标识通常是有用的,复杂的,如订单的编号等,商品的编号等。

    主键生成策略为native。

    节点为id, name表示的是,类中的属性值。 column表示的是数据表中的字段值。 column可以省略,如果省略的话,默认与name中的值相同。

    length表示长度,指定table中字段的长度. type 表示类型,将Java中的类型与数据库中的类型进行一一对应起来。

    可以写Java中的全类型,如type="java.lang.Integer" ,type="java.lang.String" 也可以写成简写形式,

    type="int" ,type="string"。 generator 指定主键的生成策略, class指定名称,为"native"。

    <id name="id" column="id" length="11" type="int">
    	<generator class="native"></generator>
    </id>
    

    也可以为这个字段添加相应的注释,即在数据库中对每个字段添加相应的备注。 如果添加备注,则需要这样写,此时就不能将column直接跟在name后面了,此时column必须放在generator的前面。 column中的name表示的是数据库中的字段值。

                    <id name="id" length="11" type="int">
    			<column name="id">
    				<comment>这是一个虚拟的主键</comment>
    			</column>
    			<generator class="native"></generator>	
    		</id>
    

    生成后的表为:

    在这里插入图片描述

    主键生成策略为UUID

    如果主键生成策略是UUID的话,那么id此时就不能是Integer或者int类型了,就必须是String类型了。

    private String uid, 生成uid的setter和getter方法。 然后在generator中令class="uuid" 即可。

                    <id name="uid" length="100" type="string">
    			<column name="uid">
    				<comment>这是一个uuid形式的主键</comment>
    			</column>
    			<generator class="uuid"></generator>	
    		</id>
    

    在保存对象时,不需要设置user.setUid() 的值,仍然与以前一样,不用管uid的值,系统会自动生成一个UUID的值,然后将其放置到uid中。

    一.五 普通属性 property

    在一个类中只有一个唯一标识符id, 其余的均是普通属性,用property节点。

    property中有常见的name, 表示类中的属性值。 column表示数据表中字段值,length表示长度,type表示类型。 其中还有表示约束的值, not-null="true" ,表示不为空的约束。not-null="false",表示可以为空。 unique="true" 表示唯一约束。 unique="false",表示不是唯一的,可以重复的。

    <property name="password" column="password" length="20" not-null="true" 
    		type="string" unique="false"></property>
    

    如果为普通属性添加备注的话,与id相同:

     <property name="password" length="20" not-null="true" type="string" unique="false">
    	<column name="password">
    		<comment>密码</comment>
    	</column>
    </property>
    

    一.六 其余属性

    还有其他的属性,如array, set,one-to-one,catch 等,这些属性到后面再做介绍。

    二. Java与数据库的type类型转换

    常见有,int,float,long,string,date等。

    约束关系如下:

    在这里插入图片描述

    详细可以参考: https://www.cnblogs.com/bluepoint2009/p/database-datatype-java.html

    三. hibernate.cfg.xml约束文件

    三.一 相应约束

    <!DOCTYPE hibernate-configuration PUBLIC
            "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
    
    

    三.二 根节点 hibernate-configuration

    根节点只有一个,hibernate-configuration, Hibernate的配置。 configuration. 没有任何子属性。

    <hibernate-configuration>
        
    </hibernate-configuration>
    
    

    三.三 session-factory节点

    hibernate-configuration中里面有一个security 节点,表示安全。 一般不用。 里面有一个常见的session-factory. 表示session工厂,里面有一个字段,name,表示名称。 一般name也不写出来。

    <session-factory>
        
    </session-factory>
    
    

    session-factory中有三种类型的配置,一种是关于数据库信息的配置,第二种是关于Hibernate信息的配置,

    第三种是将映射文件引入到核心配置文件中的配置

    三.四 数据库信息的配置

    主要配置数据库的driverClass,url,username和password。 前缀hibernate表示确切一下,指的只是Hibernate. 当Hibernate与Spring进行整合时,Spring也可以整合其它的数据库如MyBatis, 用Hibernate表示确切,让开发者能够迅速明白,这是整合Hibernate的。 建议带上。 为connection.driver_class, connection.url, connection.username,connection.password

    <!-- 关于数据库的相应配置 -->
    		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
    		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate?characterEncoding=utf8</property>
    		<property name="hibernate.connection.username">root</property>
    		<property name="hibernate.connection.password">abc123</property>
    

    三.五 Hibernate信息的配置

    关于数据库方言的配置,如果是MySQL数据库,dialect,统一用MySQL5Dialect

    <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>
    

    关于是否显示sql语句的配置 为true或者false, hibernate.show_sql

    
    <property name="hibernate.show_sql">true</property>
    

    关于是否格式化显示sql语句的配置 hibernate. format_sql

    
    <property name="hibernate.format_sql">true</property>
    

    关于是否自动创建表的配置(必须添加) hbm2ddl.auto 用Update

    
    <property name="hibernate.hbm2ddl.auto">update</property>
    

    常见的值有update和create. 用update,表示没有添加,有则更新。 create每次都先删除,后创建,即重新创建。

    这些配置值都不是瞎写的,均是在hibernate.properties文件中。

    其中常见的配置如下:

    在这里插入图片描述

    三.六 引入C3PO连接池

    Hibernate也可以与C3PO连接池进行相应的整合,在hibernate-release-5.2.17.Finalliboptionalc3p0 路径下,找到

    在这里插入图片描述
    将其添加到项目工程中。

    在hibernate.cfg.xml文件中继续添加关于C3p0的配置:

    <!-- 添加C3P0的相应配置 -->
            <property  name="hibernate.connection.provider_class">
                org.hibernate.connection.C3P0ConnectionProvider
            </property>
            <property name="hibernate.c3p0.max_size">20</property>
            <property name="hibernate.c3p0.min_size">5</property>
            <property name="hibernate.c3p0.timeout">120</property>
            <property name="c3p0.idle_test_period">120</property>
    

    重启进行测试,将log4j2.xml中的级别改成info级别。

    在这里插入图片描述

    表示C3P0连接池正常使用。

    三.七 引入映射文件

    只有将映射文件引入到核心配置文件中,核心配置文件才会调用映射文件,然后将映射文件User.hibernate.xml中的内容进行相应的解析,才会将类转换成相应的数据库表。 如果没有自动生成表,看一看是否是因为没有将映射文件放入到核心配置文件中。

    单个资源引入: ctrl+鼠标点击时可以正确的跳转。

    用了一下class和package,发现并没有自动生成表.

    
    <mapping class="com.yjl.pojo.User"/> <!--没有自动生成-->
    
    <mapping package="com.yjl.pojo"/> <!--没有自动生成-->
    
    

    在这里插入图片描述

    class 和 package 在注解时使用, 不能在 xml 配置文件中使用。


    谢谢您的观看,如果喜欢,请关注我,再次感谢 !!!

  • 相关阅读:
    Emgu安装配置及使用
    ASP.NET动态网站制作(1)--html
    ASP.NET动态网站制作(0)
    文件自动拆分
    visual studio 常用快捷键
    用vector构造自动扩容的二维数组
    C++中的struct
    Word论文写作如何实现公式居中、编号右对齐
    借助 Filter 生成静态页面缓存问题
    xshell 中解决中文乱码问题
  • 原文地址:https://www.cnblogs.com/yjltx/p/13138944.html
Copyright © 2011-2022 走看看