介绍Hibernate的经典内容:对象关系映射。主要介绍映射的基本概念,映射的分类,映射文件。

概念

ORM(Object Relational Mapping),即对象关系映射。它的作用就是在关系型数据库和对象之间做了一个映射。从对象(Object)映射到关系(Relation),再从关系映射到对象。相信很多人跟小编一个毛病,看到概念就头疼,下面小编画了一张图加深理解。

这张图特别简单:原来,没有Hibernate时,我们需要通过JDBC+手动写SQL语句来操作数据库,现在,有了Hibernate,它将JDBC+SQL进行了高度封装,我们不需要再去和复杂SQL打交道,只要像操作对象一样操作数据库就可以了。

ORM的实现思想就是将数据库中表的数据映射成对象,Hibernate可以使我们采用对象化的思维操作关系型数据库。

映射文件

Hibernate在实现ORM功能的时候主要用到的文件有:

    1、 映射类(*.Java):它是描述数据库表的结构,表中的字段在类中被描述成属性,将来就可以实现把表中的记录映射成为该类的对象了。

 

    2、映射文件(*.hbm.xml):它是指定数据库表和映射类之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。

 

    3、
hibernate核心配置文件(*.properties/*.cfg.xml):它指定hibernate的一些核心配置,包含与数据库连接时需要的连接信息,比如连接哪种数据库、登录数据库的用户名、登录密码以及连接字符串等。映射文件的地址信息也放在这里。

分类

上面的内容看上去挺多,其实特别少,基本映射很简单,我们主要学习关联关系映射,其他几种映射一般不会用,只需要了解即可,用的时候看一下相关资料会做就好。

基本映射

上篇博文我们已经实现了一个基本映射,是使用XML方式配置映射,如下所示:

  1. <span style="font-size:12px;"><?xml version="1.0"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mapping>
  6. <class name="com.liang.hibernate.User" >
  7. <id name="id">
  8. <!-- 算法的核心思想是结合机器的网卡、当地时间、一个随机数来生成GUID -->
  9. <generator class="uuid"></generator>
  10. </id>
  11. <property name="name"></property>
  12. <property name="password"></property>
  13. <property name="createTime" type="date"></property>
  14. <property name="expireTime" type="date"></property>
  15. </class>
  16. </hibernate-mapping></span>

除了XML方式配置映射外,还可以通过给类文件添加注解的方式配置映射,在上篇博文的基础之上,我们稍加修改。

1、加入hibernate annotion支持包

*hibernate-annotations.jar

      *hibernate-commons-annotations.jar

      *ejb3-persistence.jar

如图所示:

2、建立实体类User,采用注解完成映射

  1. package com.liang.hibernate;
  2. import java.util.Date;
  3. import javax.persistence.Column;
  4. import javax.persistence.Entity;
  5. import javax.persistence.GeneratedValue;
  6. import javax.persistence.GenerationType;
  7. import javax.persistence.Id;
  8. import javax.persistence.Temporal;
  9. import javax.persistence.TemporalType;
  10. @Entity //不写Table默认为user,@Table(name="t_user")
  11. public class User {
  12. @Id //主键
  13. @GeneratedValue(strategy=GenerationType.AUTO)//采用数据库自增方式生成主键
  14. //JPA提供的四种标准用法为TABLE,SEQUENCE,IDENTITY,AUTO.
  15. //TABLE:使用一个特定的数据库表格来保存主键。
  16. //SEQUENCE:根据底层数据库的序列来生成主键,条件是数据库支持序列。
  17. //IDENTITY:主键由数据库自动生成(主要是自动增长型)
  18. //AUTO:主键由程序控制。
  19. private int id;
  20. private String name;
  21. private String password;
  22. @Temporal(TemporalType.DATE)//生成yyyy-MM-dd类型的日期
  23. private Date createTime;
  24. @Temporal(TemporalType.DATE)//生成yyyy-MM-dd类型的日期
  25. private Date expireTime;
  26. public int getId() {
  27. return id;
  28. }
  29. public void setId(int id) {
  30. this.id = id;
  31. }
  32. @Column(name="name",unique=true,nullable=false) //字段为name,不允许为空,用户名唯一
  33. public String getName() {
  34. return name;
  35. }
  36. public void setName(String name) {
  37. this.name = name;
  38. }
  39. public String getPassword() {
  40. return password;
  41. }
  42. public void setPassword(String password) {
  43. this.password = password;
  44. }
  45. public Date getCreateTime() {
  46. return createTime;
  47. }
  48. public void setCreateTime(Date createTime) {
  49. this.createTime = createTime;
  50. }
  51. public Date getExpireTime() {
  52. return expireTime;
  53. }
  54. public void setExpireTime(Date expireTime) {
  55. this.expireTime = expireTime;
  56. }
  57. }

注:由于主键改成了自增长,所以数据类型修改成了int类型

3、提供hibernate.cfg.xml文件,将实体类User加入到hibernate.cfg.xml配置文件中,完成基本配置

  1. <span style="font-size:12px;"><!DOCTYPE hibernate-configuration PUBLIC
  2. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
  4. <hibernate-configuration>
  5. <session-factory>
  6. <!-- 驱动 -->
  7. <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
  8. <!-- 数据库URL -->
  9. <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_first</property>
  10. <!-- 数据库用户名 -->
  11. <property name="hibernate.connection.username">root</property>
  12. <!-- 数据库密码 -->
  13. <property name="hibernate.connection.password">123456</property>
  14. <!-- mysql的方言 -->
  15. <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
  16. <!-- 映射文件 -->
  17. <!--  <mapping resource="com/liang/hibernate/User.hbm.xml"/>  -->
  18. <!-- 由原来的映射文件,改成实体类 -->
  19. <mapping class="com.liang.hibernate.User"/>
  20. </session-factory>
  21. </hibernate-configuration></span>

4、编写工具类ExportDB.java,注解生成ddl,必须采用AnnotationConfiguration类

  1. <span style="font-size:12px;">package com.liang.hibernate;
  2. import org.hibernate.cfg.AnnotationConfiguration;
  3. import org.hibernate.cfg.Configuration;
  4. import org.hibernate.tool.hbm2ddl.SchemaExport;
  5. /**
  6. * 将hbm生成ddl
  7. * @author liang
  8. *
  9. */
  10. public class ExportDB{
  11. public static void main(String[]args){
  12. //默认读取hibernate.cfg.xml文件
  13. Configuration cfg = new AnnotationConfiguration().configure();
  14. SchemaExport export = new SchemaExport(cfg);
  15. export.create(true, true);
  16. }
  17. }</span>

数据库生成表如图所示:

5、建立客户端类Client,添加用户数据到MySQL

  1. package com.liang.hibernate;
  2. import java.util.Date;
  3. import org.hibernate.Session;
  4. import org.hibernate.SessionFactory;
  5. import org.hibernate.cfg.AnnotationConfiguration;
  6. import org.hibernate.cfg.Configuration;
  7. public class Client {
  8. public static void main(String[]args){
  9. //读取hibernate.cfg.xml文件
  10. Configuration cfg = new AnnotationConfiguration().configure();
  11. //建立SessionFactory
  12. SessionFactory factory =cfg.buildSessionFactory();
  13. //取得session
  14. Session session = null;
  15. try{
  16. //开启session
  17. session = factory.openSession();
  18. //开启事务
  19. session.beginTransaction();
  20. User user = new User();
  21. user.setName("jiuqiyuliang");
  22. user.setPassword("123456");
  23. user.setCreateTime(new Date());
  24. user.setExpireTime(new Date());
  25. //保存User对象
  26. session.save(user);
  27. //提交事务
  28. session.getTransaction().commit();
  29. }catch(Exception e){
  30. e.printStackTrace();
  31. //回滚事务
  32. session.getTransaction().rollback();
  33. }finally{
  34. if(session != null){
  35. if(session.isOpen()){
  36. //关闭session
  37. session.close();
  38. }
  39. }
  40. }
  41. }
  42. }

运行之后,数据库表生成的数据,如下图所示:

转:http://blog.csdn.net/jiuqiyuliang/article/details/40153905

(Hibernate进阶)Hibernate基本映射(三)的更多相关文章

  1. Hibernate学习2--对象的三种状态以及映射关系的简单配置

    上篇hibernate的博客总体简单梳理了对象持久化的一些思想以及hibernate中对象持久化化的方法,下面说说对象持久化过程的三种状态. 一.hibernate缓存的概念 1.session与缓存 ...

  2. Hibernate初探之单表映射——第二章:Hibernate进阶

    第二章:Hibernate进阶 1.hibernate.cfg.xml常用配置 2.session 简介 3.transaction简介 4.session详解 5.对象关系映射常用配置 1.hibe ...

  3. (Hibernate进阶)Hibernate映射——一对一双向关联映射(六)

    上一篇博客我们介绍了一对一的单向关联映射,单向是指只能从人(Person)这端加载身份证端(IdCard),但是反过来,不能从身份证端加载人得信息.如图所示: 关键原因在于对象模型具有方向性: 单向: ...

  4. (Hibernate进阶)Hibernate系列——总结篇(九)

    这篇博文是hibernate系列的最后一篇,既然是最后一篇,我们就应该进行一下从头到尾,整体上的总结,将这个系列的内容融会贯通. 概念 Hibernate是一个对象关系映射框架,当然从分层的角度看,我 ...

  5. (Hibernate进阶)Hibernate搭建开发环境+简单实例(二)

    hibernate是非常典型的持久层框架,持久化的思想是非常值得我们学习和研究的.这篇博文,我们主要以实例的形式学习Hibernate,不深究Hibernate的思想和原理,否则,一味追求,苦学思想和 ...

  6. 【SSH进阶之路】Struts + Spring + Hibernate 进阶开端(一)

    [SSH进阶之路]Struts + Spring + Hibernate 进阶开端(一) 标签: hibernatespringstrutsssh开源框架 2014-08-29 07:56 9229人 ...

  7. hibernate之单表映射

    目录 第一章 Hibernate初识 1-1 课程介绍 1-2 什么是ORM 1-3 Hibnerate简介 1-4 开发前的准备 1-5 编写第一个Hibernate例子 1-6 创建hiberna ...

  8. Hibernate多对多关系映射(建表)

    下边讲述Hibernate多对多关系映射. 多对多关系的表的结构为: 两个实体表,还包含一个关系表,关系表为复合主键,如果要使用Hibernate多对多关系映射,则关系表必须只包含两个字段,如果生成了 ...

  9. (Hibernate进阶)Hibernate基本原理(一)

    在开始学hibernate之前,一直就有人说:Hibernate并不难,无非是对JDBC进一步封装.一句不难,难道是真的不难还是眼高手低? 如果只是停留在使用的层面上,我相信什么技术都不难,看看别人怎 ...

随机推荐

  1. HDU 1016Prime Ring Problem

    http://acm.hdu.edu.cn/showproblem.php?pid=1016 题意:输入一个数,给出符合要求的素数环. 经典的dfs遍历. #include<iostream&g ...

  2. linux 纯字符界面显示中文

    yum -y groupinstall "Chinese Support" sed -i 's/en_US/zh_CN/' /etc/sysconfig/i18n

  3. 如何用css3实现一个图片的抖动或者弹跳

    <li onmouseout="this.className='off'"><a href=""><img src=". ...

  4. 转:【总结】浏览器CSS Hacks汇总,浏览器兼容方式CSS Hacks

    [总结]浏览器CSS Hacks汇总   浏览器兼容可以说是前端开发所要面对的第一个挑战,目前我的电脑上已经安装了6种浏览器(基于IE内核的不算,如Maxthon等). CSS hacks利用浏览器的 ...

  5. EnglishLeaning

    今天看了些hadoop官方reference感觉自己词汇量和语法真是又回到解放前了.于是,痛下决心要好好学习英语.找到了一些学习的方法,自己记录下来,也和大家一起借鉴 努力目标: 掌握大量的计算机英语 ...

  6. contiki学习笔记---process结构体

    process,字面意义,进程,看看它的结构 struct process { struct process *next; #if PROCESS_CONF_NO_PROCESS_NAMES #def ...

  7. Lua词汇约定

    Lua的标识符包含数字,字母以及下划线,数字不能作为标识符的开头. and break do else elseif end false for function goto if in local n ...

  8. 10天学会phpWeChat——第一天:核心框架的目录结构

    phpWeCaht是一款优秀的PC网站+微信公共号开发框架. 本博客系列将图文结合,详细介绍phpWeChat 的使用方法,今天进入phpWeChat系列教程之<10天学会phpWeChat&g ...

  9. C# 下载搜狗词库

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); string[] userAgent = new string[]{& ...

  10. return Acad::ErrorStatus::eOk引发error C2220: warning treated as error - no 'object' file generated

    必须先Acad::ErrorStatus es; 然后return es. 补充: 如果把cpp中#include "*.h"和#include"stdafx.h&quo ...