前言

目前已经学了如何搭建Hibernate的开发环境,以及Hibernate对应的API了…在快速入门还没讲解的就是配置文件是怎么配置的。因此,本博文主要讲解主配置文件以及映射配置文件..

主配置文件

主配置文件主要配置:

  • 数据库的信息
  • 其他参数
  • 加载映射文件

常用的配置信息都可以在hibernate-distribution-3.6.0.Final\project\etc\hibernate.properties目录下可以找到..

数据库信息

常用的配置信息都可以在hibernate.properties文件中找到,因此,我们来搜索一下:


<!-- 1. 数据库连接配置 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///hib_demo</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!--
数据库方法配置, hibernate在运行的时候,会根据不同的方言生成符合当前数据库语法的sql【大致可以理解成:不同的版本对应的SQL不同】
-->
<property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>

其他参数信息

常用的有那么三个:


<!-- 2. 其他相关配置 -->
<!-- 2.1 显示hibernate在运行时候执行的sql语句 -->
<property name="hibernate.show_sql">true</property>
<!-- 2.2 格式化sql -->
<property name="hibernate.format_sql">true</property>
<!-- 2.3 自动建表 -->
<property name="hibernate.hbm2ddl.auto">update</property>

需要我们注意的是自动建表,其中它有几个参数:

  • create-drop 每次在创建sessionFactory时候执行创建表。当调用sesisonFactory的close方法的时候,删除表!
  • create 每次都重新建表; 如果表已经存在就先删除再创建
  • update 如果表不存在就创建; 表存在就不创建;
  • validate (生成环境时候) 执行验证: 当映射文件的内容与数据库表结构不一样的时候就报错!

加载映射文件

值得注意的是:mapping的属性使用的是resource!


<!--3. 加载映射文件-->
<mapping resource="zhongfucheng/domain/User.hbm.xml"/>

加载映射文件其实我们可以在程序中加载,不一定在配置文件中配置….一般地,我们在测试的时候一般使用程序的方式去加载映射文件【方便】

那么怎么在程序中加载映射文件呢?

在Configuration对象中提供了addClass()的方法

一般地我们的映射配置文件和JavaBean对象是放在同一个包下的。并且映射文件的命名是有规范的。因此Hibernate是可以通过提供的JavaBean对象从而找到相对应的映射文件

        //获取加载配置管理类
Configuration configuration = new Configuration(); //加载User的映射文件!
configuration.configure().addClass(User.class);

映射配置文件

映射文件: 映射一个实体类对象; 描述一个对象最终实现可以直接保存对象数据到数据库中

通常地,我们都是一个JavaBean对象对应一个映射配置文件,并且配置文件和JavaBean对象是放在同一个目录下的

我们按照快速入门的映射配置文件一步一步来讲解:


<!--在domain包下-->
<hibernate-mapping package="zhongfucheng.domain"> <!--类名为User,表名也为User-->
<class name="User" table="user"> <!--主键映射,属性名为id,列名也为id-->
<id name="id" column="id">
<!--根据底层数据库主键自动增长-->
<generator class="native"/> </id> <!--非主键映射,属性和列名一一对应-->
<property name="username" column="username"/>
<property name="cellphone" column="cellphone"/>
<property name="password" column="password"/>
</class>
</hibernate-mapping>

<hibernate-mapping>节点

常用的属性:

  • package【要映射的对象所在的包(可选,如果不指定,此文件所有的类都要指定全路径)】
  • auto-import
    • 默认为true, 在写hql的时候自动导入包名
    • 如果指定为false, 再写hql的时候必须要写上类的全名;

<class>节点

class 映射某一个对象的(一般情况,一个对象写一个映射文件,即一个class节点)

常用的属性:

  • name【指定要映射的对象的类型】
  • table【指定对象对应的表】
    • 如果没有指定,默认与对象名称一样

<property>节点

property是普通属性的映射,即JavaBean普通的成员变量属性就使用property来描述

常用的属性:

  • name 指定对象的属性名称
  • column 指定对象属性对应的表的字段名称
    • 如果不写默认与对象属性一致
  • length 指定字符的长度, 默认为255
  • type 指定映射表的字段的类型,如果不指定会匹配属性的类型
    • java类型: 必须写全名【例:java.lang.String】

      -* hibernate类型: 直接写类型,都是小写*

值得注意的是:如果列名称为数据库关键字,需要用反引号或改列名。当然啦,我们一般不使用关键字来作为列名

7———-

<id>节点

id是主键映射….

  • name 指定对象的属性名
  • column 指定对象属性对应的表的字段名称

<id>节点下还有子节点<generator class=""/>

主键的自动生成策略

  • identity 自增长(mysql,db2)
  • sequence 自增长(序列), oracle中自增长是以序列方法实现**
  • **native 自增长【会根据底层数据库自增长的方式选择identity或sequence】
    • 如果是mysql数据库, 采用的自增长方式是identity
    • 如果是oracle数据库, 使用sequence序列的方式实现自增长
  • increment 自增长(会有并发访问的问题,一般在服务器集群环境使用会存在问题。)

指定主键生成策略为手动指定主键的值

  • assigned

指定主键生成策略为UUID生成的值

  • uuid

foreign(外键的方式, one-to-one讲)


<composite-id>

主键一般分为两种:

  • 单列主键
  • 多列复合主键

单列主键就是上面那种,那么如果要使用多列复合主键就需要使用<composite-id>节点来配置了

  • 现在我有这么下面的一个对象,我想使用username和password作为复合主键
public class User2 {

    private String username;
private String password;
private String cellphone; //各种setter和getter方法
}
  • 将username和password抽取成一个类—->CompositeKey….必须实现Serializable接口

package zhongfucheng.domain; /**
* Created by ozc on 2017/5/6.
*/
public class CompositeKey implements Serializable{ private String username;
private String password; public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
}
}
  • 在User2中需要指定一个变量来维护这个主键对象

package zhongfucheng.domain; /**
* Created by ozc on 2017/5/6.
*/
public class User2 { //在User对象中维护这个主键对象
private CompositeKey key;
private String cellphone; public CompositeKey getKey() {
return key;
} public void setKey(CompositeKey key) {
this.key = key;
} public String getCellphone() {
return cellphone;
} public void setCellphone(String cellphone) {
this.cellphone = cellphone;
}
}

测试


public static void main(String[] args) { //创建对象
User2 user2 = new User2();
CompositeKey compositeKey = new CompositeKey();
compositeKey.setUsername("123");
compositeKey.setPassword("123");
user2.setCellphone("111");
user2.setKey(compositeKey); //获取加载配置管理类
Configuration configuration = new Configuration(); //加载User的映射文件!
configuration.configure().addClass(User2.class); //创建Session工厂对象
SessionFactory factory = configuration.buildSessionFactory(); //得到Session对象
Session session = factory.openSession(); //使用Hibernate操作数据库,都要开启事务,得到事务对象
Transaction transaction = session.getTransaction(); //开启事务
transaction.begin(); //添加User2对象到数据库
session.save(user2); //提交事务
transaction.commit(); //关闭Session
session.close();
}

因为Hibernate在取得的时候是需要实现Serializable这个接口的对象的…因此compositeKey必须实现Serializable接口

Hibernate第三篇【主配置文件、映射文件、复合主键映射】的更多相关文章

  1. Hibernate之关联关系映射(一对一主键映射和一对一外键映射)

    1:Hibernate的关联关系映射的一对一外键映射: 1.1:第一首先引包,省略 1.2:第二创建实体类: 这里使用用户信息和身份证信息的关系,用户的主键编号既可以做身份证信息的主键又可以做身份证信 ...

  2. 【开源.NET】轻量级内容管理框架Grissom.CMS(第三篇解析配置文件和数据以转换成 sql)

    该篇是 Grissom.CMS 框架系列文章的第三篇, 主要介绍框架用到的核心库 EasyJsonToSql, 把标准的配置文件和数据结构解析成可执行的 sql. 该框架能实现自动化增删改查得益于 E ...

  3. Hibernate(三)之配置文件详解

    一.核心配置文件(hibernate.cfg.xml) <?xml version="1.0" encoding="UTF-8"?> <!DO ...

  4. SSH框架之Hibernate第三篇

    1.1 多表关系分析和创建. 1.1.1 表关系分析和创建 表数据和表数据之间可以存在的关系? 一对多的关系 客户和联系人 建立关系原则: 在多的一方创建一个字段,这个字段作为外键指向一的一方的主键 ...

  5. SpringBoot第三篇:配置文件详解二

    作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10615605.html 版权声明:本文为博主原创文章,转载请附上博文链接! 前言   本文主要讲 ...

  6. Python 第三篇(上):python文件基础操作、json模块、lambda、map、filter、reduce和函数位置参数

    python一切皆对象,linux一切皆文件,python操作文件是很常见的O/I操作,其内置来open()函数可以完成文件的基本操作: 一:使用内置open()函数操作文件,基本语法如下: with ...

  7. 第三篇--如何修改exe文件版本号和文件信息

    控制台程序添加版本信息方法: 项目右键 Add-->Resource-->选择Version-->new,然后就可以修改里面的信息了,重新编译一下就OK.

  8. Hibernate第六篇【多对多映射、一对一映射】

    前言 前面已经讲解了一对多和多对一的映射是怎么配置了,也讲解了inverse和cascade属性对关联关系的影响,本博文讲解多对多的映射和一对一的映射! 多对多映射 需求:一个项目由多个员工开发,一个 ...

  9. Hibernate的映射文件

    映射文件的结构和属性 一个映射文件(mapping file)由一个根节点<hibernate-mapping>和多个<class>节点组成, 首先看看根节点<hiber ...

随机推荐

  1. 利用Arduino快速制作Teensy BadUSB, 攻击计算机

    BadUsb介绍 BadUSB是计算机安全领域的热门话题之一,该漏洞由Karsten Nohl和Jakob Lell共同发现,并在2014年的BlackHat安全大会上公布. 虽然已隔一两年,但还是有 ...

  2. Get json formatted string from web by sending HttpWebRequest and then deserialize it to get needed data

    static string GetLotteryByPhase(string phaseNo) { // Set the url and charset string url = "http ...

  3. js基础提高(二)

    JavaScript基础提高(二) 上篇写的是JavaScript的历史.基本的数据类型和基本的语法进填的话讲的就深入一些了. js的函数 1.js函数定义的方式 (1)普通方式 语法:functio ...

  4. 原创:Docker在云家政的应用 谢绝复制粘贴内容

    我们公司目前大规模使用了Docker,目前除了数据库应用,其他所有应用都在Docker容器内运行,下面我就Docker在公司的应用做一些分享.. 首先我介绍一下公司的背景,公司属于中小型创业公司,服务 ...

  5. Tuple元组 C#

    使用元组, 一些简单的结构或对象就不需要新建一个类了. https://msdn.microsoft.com/zh-cn/library/system.tuple.aspx

  6. js prototype属性,类似.net扩展方法

    prototype 属性使您有能力向对象添加属性和方法. 类似.net扩展方法 定义: String.prototype.toWeekName = function () { var newDate ...

  7. SSM简明教程:简单的十步教你搭建人生第一个SSM框架[ SSM框架整合教程(Spring+SpringMVC+MyBatis) ]

    SSM_BookSystem SSM框架基础 SSM_BookSystem ---> Hello CRUD 说明:本项目目前包含基础的CRUD 日期:2017-05-01 22:25:37 作者 ...

  8. nopCommerce 3.9 大波浪系列 之 使用Redis主从高可用缓存

    一.概述 nop支持Redis作为缓存,Redis出众的性能在企业中得到了广泛的应用.Redis支持主从复制,HA,集群. 一般来说,只有一台Redis是不可行的,原因如下: 单台Redis服务器会发 ...

  9. Quartz总结

    前言 最近项目中有使用到Quartz,得空便总结总结,顺便记录一下这种设计模式,毕竟"好记性不如烂笔头". 搭建 pom文件: <dependency> <gro ...

  10. Java数组笔记

    # 数组--------内存 # 2017/8/31 15:29:19  ## 数组(容器) ## - 为了存储同种数据类型的多个值 - 概念     - 数组是可以存储同一种数据类型多个元素的集合, ...