学框架,配置都是不可少的,有了配置,框架才知道我们想做什么,才知道如何去执行我们需要的操作!

hibernate的配置文件,总体来说分为两个部分:

  1.主配置文件hibernate.cfg.xml文件,一般放在classpatn路径下

  2.映射文件xxx.hbm.xml文件,一般跟实体类放在同一个包下

  前者是配置相关的数据库以及引入的映射文件信息,而后者则主要配置对象与表之间的映射关系;

  注意:配置文件的路径,因人而异,有的将映射文件集体放置在一起也有,所以看个人喜好,没有强制规定如何存放。

以下是hibernate.cfg.xml文件配置信息,为了方便记忆,我们将该配置文件内的配置信息分为三类:

  1.数据库信息:方言、url、用户名、密码、数据库驱动,以<property>标签来配置

  2.映射文件信息:即对象与表间的映射关系,以<mapping>标签来配置

  3.其它配置信息:是否显示sql语句,格式化sql,二级缓存配置等等,以<property>标签来配置

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

<hibernate-configuration>
    <session-factory name="foo">
        <!-- 配置数据库信息 -->
        <!-- 配置数据库方言 -->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
        <!-- 配置数据库url -->
        <property name="connection.url">jdbc:mysql:///hibernate</property>
        <!-- 配置数据库驱动(mysql) -->
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <!-- 配置数据库用户名 -->
        <property name="connection.username">root</property>
        <!-- 配置数据库密码 -->
        <property name="hibernate.connection.password">1208</property>

        <!-- 是否显示sql -->
        <property name="hibernate.show_sql">true</property>

        <!-- 导入映射文件 该文件就是实体与数据库表之间的对应关系-->
        <mapping resource="com/hibernate/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

以下是映射文件基础配置,基础配置相对简单,后续还有关联配置、集合配置、通过注解配置等等:

  为方便记忆,基础配置分为以下几类:

  1.由于配置文件是配置对象与表之间的关系,所以必须配置对应的实体所在的包路径,以<hibernate-mapping>标签来配置;

  2.接着开始配置实体与表之间的关系,使用<class>标签配置,通过name属性配置实体名,通过table属性配置表名;

  3.理论上,每个表都应该设置一个主键,所以应该配置主键id,使用<id>标签进行配置;

  4.实体的属性与表的列名对应,使用<property>进行配置;

  以下面的基础配置代码为准:

<?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.hibernate">
    <!-- 实体的名称、对应表名 -->
    <class name="User" table="sys_user">
        <!-- 主键id、主键id类型、在表中的列名 -->
        <id name="id" type="int" column="id">
            <!-- 自动增长 -->
            <generator class="native"/>
        </id>
        <!-- 实体属性名、实体属性类型、在表中的列名 -->
        <property name="name" type="string" column="name" length="20"/>
    </class>
</hibernate-mapping>

主键属性(以<id>标签配置)配置说明:

   主键属性,使用<id>标签进行配置,这里需要注意的是表中主键对应的对象属性最好使用包装类来修饰,例如表中的主键名为id,相对应的对象中的属性(假设也叫id)最好这么声明private Integer id;原因为如果使用private int id进行声明,那么id的初始值为0,如果以Integer对id进行声明,那么初始值为null,如果id为null表示与数据库中的表数据并没有对应关系即数据库并不存在该条数据。

   子元素以<generator>标签配置,是用于主键生成策略的,常用的值有:

     assigned:代表手工指定id,意思为向表中插入数据时,必须指定id值;

     native:根据底层数据库的能力,选择identity、sequence、hilo中的一个;

     identity:使用数据库的主键生成策略,注意不是所有的数据库都支持自动增长策略的;

     sequence:在DB2、oracle、postgreSQL中使用此策略;

     increment:查询表中id的最大值,然后由hibernate维护+1,不过不推荐使用,因为在多线程下会有问题;

     uuid:由hibernate自动生成UUID,并指定为主键值,生成的值例如:4DEHS4523232JDKALDAJKLFDKAJ(类似);

     hilo:按照高地位算法生成主键值,需要做以下配置

     <generator class="hilo">
       <param name="table">htbl</param>
       <param name="column">next_value</param>
       <param name="max_lo">100</param>
     </generator>

     htbl表只有一个字段next_value,该字段用来记录sys_user表插入了几次数据,max_lo属性用来设置每次增长的数据值,例如执行插入sys_user表数据第一次,那么htbl的next_value值就更新为1,sys_user表中的id值也为1,再次执行插入sys_user表,那么htbl的next_value值就更新为2,此时sys_user表中插入数据,这时插入的数据的行id变为101,从插入的第二次开始,sys_user的行id就通过属性max_lo来控制。该策略的优点是只需要额外的一张表,并且所有的数据都支持。

    总结:一般使用native,配置数据库的时候就不需要修改该值。但具体的还是看情况,例如使用oracle,我们很清楚主键策略使用sequence,那就直接配置为sequence。

普通属性(非<id>标签配置,指以<property>配置)配置说明:

  name属性:对象的名称或对象属性的名称,必须要有;

  type属性:表示类型,如果不写,hibernate会自动检测,可以写java中类的全名或者写hibernate的类型,个人习惯是写hibernate类型,如字符串类型为string,数字类型为int,日期类型为date等等,可以参考下方的映射类型对照表和日期类型对照表;

  column属性:对应表中的列名,如果没有,则默认为属性名,但是注意,如果属性名和表中的关键字重名了,这时候还是必须指定column属性,例如<property name="desc"/>如果默认属性名,那么执行程序会报错,因为desc和sql的排序关键字desc重名了,那么我们可以添加属性为column="desc_",如果一定要使用desc为列名,那么修改column属性为column=" 'desc' ";

  length属性:长度,不是所有的类型都有长度属性,比如varchar有,但是int就没有;

  not-null属性:非空约束,默认为false

  注意:如果实体中存在二进制属性,例如private byte[] photo,那么hbm文件中必须配置为

     <property name="photo" type="binary" length="102400" column="photo"/>

     以上是二进制属性在hibernate中的映射文件中的配置方法

Hibernate映射类型对照表
java类型  Hibernate映射类型  SQL类型
java.math.BigDecimal big_decimal numeric
byte[] binary varbinary(blob)
boolean(java.lang.Boolean) boolean bit
byte(java.lang.Byte) byte  tinyint
java.util.Calendar calendar timestamp
java.sql.Clob clob clob
java.util.Date 或java.sql.Date date date
double(java.lang.Double) double double
float(java.lang.Float) float float
int (java.lang.Integer) integer integer
java.util.Local local varchar
long(java.lang.Long) long bigint
java.io.Serializable的某个实例 serializable varbinary(或blob)
java.lang.String string varchar
java.lang.String text clob
java.util.Date 或 java.sql.Timestamp time timestamp
 
Java日期和时间类型的Hibernate映射类型

映 射 类 型

Java类型

标准SQL类型

描    述

date

java.util.Date或者java.sql.Date

DATE

代表日期,形式为:

YYYY-MM-DD

time

java.util.Date或者java.sql.Time

TIME

代表时间,形式为:

HH:MM:SS

timestamp

java.util.Date或者java.sql.

Timestamp

TIMESTAMP

代表时间和日期, 形式为:

YYYYMMDDHHMMSS

calendar

java.util.Calendar

TIMESTAMP

同上

calendar_date

java.util.Calendar

DATE

代表日期,形式为:

YYYY-MM-DD

这些实体与表映射关系配置信息,可以在表创建好之前配置,也可以在表创建后配置,什么意思?

这意味着我们可以不需要去创建表。当然,不想去创建表,还得需要配置,让hibernate帮我们去数据库创建表(自动帮我们生成表结构),在hibernate.cfg.xml文件内,在我们所谓的其他配置区域,配置上<property name="hbm2ddl.auto">create</property>,这样当运行程序,hibernate自动根据映射文件配置的表信息,去数据库创建表结构。

但是需要注意的是,配置该信息,每次执行程序后,hibernate会帮我们先去数据库查找是否存在该表,如果存在则删除再创建,如果不存在则直接创建表,缺点是并不会保留数据库表信息,每次执行程序后表都会被删除然后重新创建。

如果想避免这种情况,则将上述配置改为<property name="hbm2ddl.auto">update</property>,如此配置,当执行程序后,hibernate表不存在,则创建;发现表存在,并不删除表,只是则按照程序,更新数据。

还有一种配置,适合测试的时候用,即<property name="hbm2ddl.auto">create-drop</property>,如此配置,即初始化时创建表(程序启动),在session工厂(SessionFactory)执行close方法时,删除该表。

另外,该属性最后一种配置,即<property name="hbm2ddl.auto">validator</property>,这种配置在开发环境一般都不用,一旦hibernate发现hbm映射文件与数据库中表结构不一样,会抛出异常,开发中,表结构不随意更改,所以一般不使用该配置。

但是:总的来说,开发中,一般表结构我们都会事先创建好,一般都是使用脚本命令直接执行脚本,所以上述所谓"懒人建表"方法个人觉得适合学习用。

与hbm映射文件相关的持久化对象:

  映射文件配置着对象与表间的对应关系,所以hibernate对持久化对象也是有要求的

  1.持久化对象必须有无参构造器

    例如:查询表中第一个用户,使用User对象来接收数据,User u = session.get(User.class,1);这时hibernate会通过反射帮我们创建一个User对象,然后再把数据塞进该对象,所以如果对象没有无参构造器,hibernate就没办法帮我们创建一个实体实例了。

  2.提供一个标识的属性(通常映射为表的主键字段)

  3.提供属性的get/set方法

  ***以上3点是必须做的事项***

  4.不能给持久化对象设置final,这样导致该对象不能被继承,即最终类,会影响hibernate的懒加载功能,这个后续说,但是没什么需求会给对象设置final

  5.如果需要把持久化对象放入到set中,当需要进行关联映射时,持久化对象需要重写equals和hashcode方法

  

  

2.一起来学hibernate之配置文件1与持久化对象的更多相关文章

  1. 3.一起来学hibernate之配置文件2

    之前的映射文件配置都是简单的.基础的配置,只涉及到单个javabean,对于单个javabean的增删改查都能很好的.简单的去完成. 但是知道简单配置远远不够,并不能完成很多复杂的情况,比如对象与对象 ...

  2. Hibernate的配置文件以及用法

    一. 三大框架 Hibernate 1.安装hibernate插件至ecilpse 2.进行配置 2.1 主配置文件 <?xml version="1.0" encoding ...

  3. 1.一起来学hibernate之hibernate简介

    一.简介 Hibernate,是一个开源的ORM框架.所谓的ORM,即object relative mapping,就是对象关系映射. 那什么是对象关系映射? 对象,即java类,又称为实体类,对象 ...

  4. eclipse 新建 maven 项目 添加 spring hibernate 的配置文件 详情

    主要配置文件 pom.xml 项目的maven 配置文件 管理项目所需 jar 依赖支持 web.xml 项目的总 配置文件  :添加 spring和hibernate 支持 applicationC ...

  5. Hibernate 的配置文件

    Hibernate 配置文件 •Hibernate 配置文件主要用于配置数据库连接和 Hibernate 运行时所需的各种属性 •每个 Hibernate 配置文件对应一个 Configuration ...

  6. Hibernate常用配置文件详解

    本文转载自:http://blog.csdn.net/csh624366188/article/details/7578939 初学hibernate的童鞋,刚开应该都有这种感觉,hibernate的 ...

  7. Hibernate的配置文件解析

    配置mybatis.xml或hibernate.cfg.xml报错: <property name="connection.url">jdbc:mysql://loca ...

  8. hibernate 基本配置文件及CRDU的操作和基本的HQL查询

    以下所有内容保存在 E:\JavaWebSrc\firstHibernate 目录中,项目名称为firstHibernate,使用IDEA打开,项目所需jar包在  F:\常用综合\常用jar包\hi ...

  9. Hibernate之深入Hibernate的配置文件

    1.创建Configuration类的对象 Configuration类的对象代表了应用程序到SQL数据库的映射配置.Configuration类的实例对象,提供一个buildSessionFacto ...

随机推荐

  1. Lucene教程(转)

    Lucene教程 1 lucene简介1.1 什么是lucene    Lucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿来 ...

  2. MSSql Server 索引'uq_f_userName' 依赖于 列'f_userName'。由于一个或多个对象访问此列,ALTER TABLE ALTER COLUMN f_userName 失败

    --需求有变,需要往t_login表的f_userName字段添加外国人名,之前设置的varchar(10)不够,商议决定改成varchar(30),执行的时候,提示消息 索引'uq_f_userNa ...

  3. 把vim当做golang的IDE

    开始决定丢弃鼠标,所以准备用vim了. 那么在vim里面如何搭建golang环境呢? git盛行之下,搭建vim环境是如此简单. 而且vim搭建好了之后,基本上跟IDE没有差别. 高亮.自动补全.自动 ...

  4. XHTML标签的嵌套规则分析

    在 XHTML 的语言里,我们都知道:ul 标签包含着 li.dl 标签包含着 dt 和 dd——这些固定标签的嵌套规则十分明确.但是,还有许多标签是独立的,它们没有被捆绑在一起,比如 h1.div. ...

  5. sql脚本查询日期时间段日期

    ---列举指定时间月份DECLARE @date1 VARCHAR(10) , @date2 VARCHAR(10)SET @date1 = '2010-01-01'SET @date2 = '201 ...

  6. <停车卫> 产品需求说明书 version 2.0

    <停车卫> 产品需求说明书 文档版本号: Version 2.0 文档编号: xxxx 文档密级: 归属部门/项目: 产品名: 停车卫 子系统名: 编写人: kina 编写日期: 2015 ...

  7. Python 字符串分割的方法

    在平时工作的时候,发现对于字符串分割的方法用的比较多,下面对分割字符串方法进行总结一下:第一种:split()函数split()函数应该说是分割字符串使用最多的函数用法:str.split('分割符' ...

  8. 01-Swift 介绍

    简介 Swift 语言由苹果公司在 2014 年推出,用来撰写 OS X 和 iOS 应用程序 2014 年,在 Apple WWDC 发布 几家欢喜,几家愁 愁者:只学Object-C的人 欢喜者: ...

  9. easy ui 零散技巧

    1.Jquery带上下文查找: 格式:$(selector,context) 例如:$("input",window.document),查找当前文档下的说有input元素,也等价 ...

  10. 关于String中+与StringBuilder的问题

      字符串连接可以通过两种方法实现,其中一种是在Java中提供的一个StringBuilder类(这个类只在J2SE5及以上版本提供,以前的版本使用StringBuffer类). 字符串是Java程序 ...