ORM:Object/Relationship Mapping  对象/关系映射
 
实现流程
 
1.项目中导入Hibernate相关类包并创建配置文件。Hibernate.cfg.xml(可放在src根目录下):   
          <session-factory>
<property name="hibernate.connection.username">root</...>
<property name="hibernate.connection.password">123</...>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</...>
<property name="hibernate.connection.url">jdbc:mysql://loaclhost:3306/TABLE?useUnicode=true&amp;characterEncoding=utf-8</...>
<property name="hibernate.dialect">org.hibernate.dialtct.MySQLDialect</...> <property name="show_sql">true</...>
<property name="format_sql">true</...>
<property name="hbm2ddl.auto">assigned</...>
</session-factory>
2.创建持久化类(实体类)(一对多时,在一方添加set集合HashSet用以包含多方,代码略);
 
 
3.创建对应映射文件(实体类到数据库)。Grade.hbm.xml(Hibernate5以上可能需要与实体类放在一个包内):     
 <hibernate-mapping>
<class name="com.entity.Grade" table="GRADES”>
<id name="gid" column="SID" type="java.lang.Integer">
<generator class="increment"></generator>
</id>
<property name="gname" type="java.lang.String">
<column name="GNAME" length="20"></column>
</property>
<property name="amount" type="java.lang.Integer">
<column name="AMOUNT"></column>
</property>
<!-- 一对多需配置set -->
<set name="student"(Grade中属性,实体类)table="STUDENTS">
<key column="gid"></key>
<one-to-many class="com.entity.Student"/>
</set>
</class>
</hibernate-mapping>
  上图为一对多点一方配置。实现双向配置时,需在多对一对多端同时添加配置<many-to-one>标签

多对一的映射文件配置:
<many-to-one     name="grade"对应属性 class=”com.entity.Grade"  column="grade">
</many-to-one>
 
关于双向级联的补充:
  (1)inverse属性:指定关联关系维护方。在one一方的<set>标签中,表示反转;默认为fasle,表示关联关系由one方维护;
 
   保存one方时,one方所包含的many方对象若数据库中不存在,应一同保存,此为级联操作。通过cascade实现。 
  (2)cascade属性:all所有操作级联;save-update保存和更新时级联操作;delete删除时级联操作;none不级联操作。 在one 方的<set>标签中或many方的<many-to-one>标签中设置。

 
 
4.在配置文件中添加映射文件路径:
          <session-factory>
.......... <mapping resource="src/com/entity/Grade.hbm.xml"/>
<mapping resource="src/com.entity/Student.hbm.xml"/>
</session-factory>
5.编写查询操作类:                    //版本不同存在差异4与5
  1. 利用configuration创建sessionFactory对象;
  2. 通过sessionFactory创建session对象;
  3. 通过sessionFactory获取session(openSession方法或getCurrentSession方法);
  4. 通过session开启transaction事务(beginTransaction方法);
  5. 操作数据库:sesison.save()/get(Student.class,id)/load()/delete();
  6. 提交事务:transactoin.commit();
  7. 关闭session;

  Hibernate5.2的session创建:

.....
ssr = new StandardServiceRegistryBuilder().configure("hibernate.cfg.xml").build();
sessionFactory = new MetadataSources(ssr).buildMetadata().buildSessionFactory();
session = sessionFactory.openSession();
......

  

操作过程中基本摆脱数据库语句,只是对持久化类操作后进行事务的提交。各版本session创建方法待补充

Hibernate 随记(数据库映射流程)的更多相关文章

  1. Eclipse从数据库逆向生成Hibernate实体类和映射文件(Eclipse插件系列之HibernateTools)

    ♣下载安装Eclipse插件(HibernateTools) ♣Eclipse连接数据库(Mysql5.7) ♣新建hibernate.properties和hibernate.cfg.xml文件 ♣ ...

  2. [转载]Hibernate如何提升数据库查询的性能

    目录(?)[-] 数据库查询性能的提升也是涉及到开发中的各个阶段在开发中选用正确的查询方法无疑是最基础也最简单的 SQL语句的优化 使用正确的查询方法 使用正确的抓取策略 Hibernate的性能优化 ...

  3. Hibernate连接mysql数据库并自动创建表

    天才第一步,雀氏纸尿裤,Hibernate第一步,连接数据库. Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个 ...

  4. Hibernate入门3.配置映射文件深入

    Hibernate入门3.配置映射文件深入 2013.11.27 前言: 之前的两节是在Java项目中如何使用hibernate,并且通过一个简单地项目实践,期间有很多的错误,一般都是因为配置包的问题 ...

  5. Hibernate联合主键映射

    1.联合主键的映射规则 1) 类中的每个主键属性都对应到数据表中的每个主键列. Hibernate要求具有联合主键的实体类实现Serializable接口,并且重写hashCode与equals方法, ...

  6. Hibernate一对一双向关联映射

    关键原因在于对象模型具有方向性: 单向:一端只能加载另一端,不能反过来. 双向:两端都可以加载另一端. 问题来了:如何我们想从身份证端(IdCard)加载人(Person),怎么办呢? 下面我们开始介 ...

  7. Hibernate之1-N关联映射

    一.Hibernate之1-N关联映射 1. 哪边是 1 , 哪边是多 ?      须要从业务的角度来说明.比如,Employee 和 Department 之间就是 n-1 的关联关系,Order ...

  8. zTree市县实现三个梯级数据库映射

    zTree市县实现三个梯级数据库映射 Province.hbm.xml: <?xml version="1.0" encoding="UTF-8"? &g ...

  9. 快捷配置Hibernate实现对数据库的配置(构建通道)

    在基于MVC设计模式的JAVA WEB应用中,Hibernate可以作为模型层/数据访问层.它通过配置文件(hibernate.properties或hibernate.cfg.xml)和映射文件(* ...

随机推荐

  1. php本地及远程文件包含漏洞

    在php程序中包含有file inclusion的时候,php要开启一下两个功能: allow_url_fopen onallow_url_include on 但是开启这两个功能之后伴随的是url漏 ...

  2. HDU 4951 Multiplication table(2014 Multi-University Training Contest 8)

    思路   如果进制为p    那么当x<p时 (p-1)*(p-x)=(p-(x+1))  *p +x     因为x<p  所以没有进位  所以高位上的数字为    p-(x+1). 根 ...

  3. Codeforces Round #370 (Div. 2) E. Memory and Casinos (数学&&概率&&线段树)

    题目链接: http://codeforces.com/contest/712/problem/E 题目大意: 一条直线上有n格,在第i格有pi的可能性向右走一格,1-pi的可能性向左走一格,有2中操 ...

  4. (DFS、bitset)AOJ-0525 Osenbei

    题目地址 简要题意: 给出n行m列的0.1矩阵,每次操作可以将任意一行或一列反转,即这一行或一列中0变为1,1变为0.问通过任意多次这样的变换,最多可以使矩阵中有多少个1. 思路分析: 行数比较小,先 ...

  5. 检索 COM 类工厂中 CLSID 为 {820280E0-8ADA-4582-A1D9-960A83CE8BB5} 的组件失败,原因是出现以下错误: 80040154 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))。

    检索 COM 类工厂中 CLSID 为 {820280E0-8ADA-4582-A1D9-960A83CE8BB5} 的组件失败,原因是出现以下错误: 80040154 没有注册类 (异常来自 HRE ...

  6. 《Pro Express.js》学习笔记——Express服务启动常规七步

    Express服务启动常规七步 1.       引用模块 var express=require('express'), compression=require('compression'), bo ...

  7. ASP.NET中Onclick和OnserverClick事件的区别

    对于服务器按钮控件(即<asp:Button>类型的按钮): 服务器响应事件:OnClick 客户端响应属性:OnClientClick 对于html按钮控件(即<input typ ...

  8. Python的入门要点

    一.输入 1.键盘输入 在python 2.7中,不用input(),而用 raw_input()读入一行键盘输入,并转化为字符串. s = map(int ,raw_input().split()) ...

  9. android base64 和 aes 加密 解密

    package pioneerbarcode.ccw.com.encryptanddecode;import android.os.Bundle;import android.support.v7.a ...

  10. python中if __name__ == '__main__': 的解析

    当你打开一个.py文件时,经常会在代码的最下面看到if __name__ ==  '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性 __name__.一 ...