浅析Hibernate映射(一)——基本映射
在说Hibernate映射之前,先下了解下面的概念。
对象-关系映射(Object/Relation Mapping,简称ORM),是随着面向对象的软件开发方法发展而产生的,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术,本质上就是将数据从一种形式转换到另外一种形式。
面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将java程序中的对象自动持久化到关系数据库中
实现ORM的框架很多,其中当属Hibernate最为流行,下面通过几篇文章来看一下Hibernate是如何实现ORM的,即Hibernate的几种映射。
Hibernate在实现ORM功能的时候主要用到的文件有:
1、 映射类(*.java):它是描述数据库表的结构,表中的字段在类中被描述成属性,将来就可以实现把表中的记录映射成为该类的对象了。
2、映射文件(*.hbm.xml):它是指定数据库表和映射类之间的关系,包括映射类和数据库表的对应关系、表字段和类属性类型的对应关系以及表字段和类属性名称的对应关系等。
3、 hibernate核心配置文件(*.properties/*.cfg.xml):它指定hibernate的一些核心配置,包含与数据库连接时需要的连接信息,比如连接哪种数据库、登录数据库的用户名、登录密码以及连接字符串等。映射文件的地址信息也放在这里
基本映射:
java 对象
关系模型
实体类--->表,采用<class>标签映射
实体类中的普通属性(不包括集合、自定义类和数组)------->表字段,采用<property>标签映射
映射类:
- package com.jialin.hibernate;
- import java.util.Date;
- public class User {
- private int id;
- private String name;
- private String password;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getPassword() {
- return password;
- }
- public void setPassword(String password) {
- this.password = password;
- }
- }
注:
实体类的设计原则:
* 实现无参的默认的构造函数
* 提供一个标识
* 建议不要使用final修饰实体类(因为采用load延时加载数据的时候会继承实体类生成代理对象)
* 建议为实体类生成getter和setter方法(如果不使用,需要用属性field标识)
映射文件具体说明:
- <!-- XML文件的声明 -->
- <?xml version="1.0"?>
- <!-- hibernate DTD文件的声明 -->
- <!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <!-- 映射文件的根节点 -->
- <hibernate-mapping package="com.jialin.hibernate">
- <!--
- 对象关系映射的开始:class元素表示类和数据库中的表的映射关系。
- name属性指定持久化类(或者接口)的Java全限定名;
- table属性指定要映射的对应的数据库表名,如果省略,则以name作为表名
- -->
- <class name="User" table="t_user">
- <!--
- 持久化类对象的对象标识符(OID)和表的主键的映射关联:
- name属性指定类中作为OID的属性名;
- column属性表中主键字段的名字;如果省略,则以name作为字段名
- -->
- <id name="id" column="id">
- <!-- 指定对象标识符生成器:class属性指定生成器的类别名 -->
- <generator class="native" />
- </id>
- <!--
- 普通属性的映射:
- name属性:属性的名字,以小写字母开头;
- column属性:对应的数据库字段名.如果省略,则以name作为字段名
- type属性:指定Hibernate的映射类型、如果省略,则自动匹配
- -->
- <property name="name" column="user_name" type="string"/>
- <property name="password" />
- </class>
- </hibernate-mapping>
注意:如果实体类的名称或实体类中属性的名称和数据库关键字重复,将会出现问题,可以考虑采用table属性和column属性对其进行重新命名