首页 > 代码库 > Hibernate映射解析(一)—— 基本映射

Hibernate映射解析(一)—— 基本映射

在了解Hibernate框架之前,我们应该先要了解对象-关系映射(ORM)和关系型数据库这两个概念。 

对象-关系映射(ORM)主要是实现程序对象到关系数据库数据的映射。为什么这么说呢?

关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。
    
回顾我们以前开发的项目,我们在操作数据库过程中,都是在做一些映射的东西。例如,有一个User对象,我们需要做的就是把这个对象存到数据库里的哪个表,这个对象的属性对应数据库表的哪些字段,而要完成这些就需要映射。以往这些映射关系都是由我们自己来完成的。现在有了Hibernate框架,这些关系就可以由它来维护了。 

Hibernate提供了几种映射方式:

                  

Hibernate 基本组件:      
  • Hibernate 核心配置文件:Hibernate.cfg.xml文件,完成基本的配置
  • 实体类(*.java):即映射类,描述对象名和属性,对应表中的表名和字段
  • 映射文件(*.hbm.xml):指定映射类和数据库表的关系

 

基本映射


1.hibernate 核心配置文件

<!--声明Hibernate配置文件的开始-->   
<hibernate-configuration>
 <!--表明以下的配置是针对session-factory配置的,SessionFactory是Hibernate中的一个类,这个类主要负责保存HIbernate的配置信息,以及对Session的操作--> 
	<session-factory>
	 <!--配置数据库的驱动程序-->
		<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
		<!-- 设置数据库的连接url;Localhost 表示mysql服务器名称,hibernate_basemapping表示数据库名 -->
		<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_basemapping</property>
		   <!--连接数据库的用户名--> 
		<property name="hibernate.connection.username">root</property>
		   <!--连接数据库的密码--> 
		<property name="hibernate.connection.password">root</property>
		<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
		<!-- 是否在后台显示Hibernate用到的sql语句 -->
		<property name="hibernate.show_sql">true</property>
		<!-- 根据映射文件和数据库中的表对应起来,如果不一致,就更新表的结构 -->
		<property name="hibernate.hbm2ddl.auto">update</property>		
		<mapping resource="com/bjpowernode/hibernate/User.hbm.xml"/>	
	</session-factory>
</hibernate-configuration>

2.实体类
package com.blackfox.hibernate;
import java.util.Date;
public class User {

	private String id;
	
	private String name;
	
	private String password;
	
	public String getId() {
		return 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;
	}
}
	

实体类的设计原则:

  • 实现无参的默认的构造函数
  • 提供一个标识
  • 建议不要使用fianl修饰实体类
  • 建议为实体类生成gettersetter方法


3.映射文件

实体类中的普通属性(不包括集合、自定义和数组)映射成表字段,采用<property>标签映射

<!-- 可在根元素声明包名 -->
<hibernate-mapping package="com.bjpowernode.hibernate">
<!-- 使用class元素定义一个持久化类,name持久化类名,table对应数据库表名 -->
	<class name="User"  table="t_user">
		<!-- id 定义该属性到数据库表主键字段的映射 ,name 标识属性的名字,column表主键字段的名字,不写默认一样-->
		<id name="id"  column="user_id"  length="32"  access="field">
		 <!-- <generator>:指定主键由什么生成,推荐使用uuid,assigned指用户手工填入 --> 
			<generator class="uuid"/>
		</id>
		<!-- 为类定义一个持久化的javaBean风格的属性,name 属性的名字 -->
		<property name="name"  length="30"  unique="true"  not-null="true"/>
		<property name="password"/>	
	</class>
</hibernate-mapping>


注意:如果实体类的名称或实体类中属性的名称和数据库关键字重复,将会出现问题可以考虑采用table属性和column对其进行重新命名。


Hibernate 处于持久层,是我们程序跟数据库打交道的桥梁,让我们以面向对象的方式来跟数据库打交道。好处:彻底封装了JDBC隐藏细节,带来移植性。缺点:封装的太彻底,不灵活,对大数据量的更新操作还有问题。 

Hibernate 的基本映射只是冰山一角,下面还将为大家介绍Hibernate的几种关联映射。


Hibernate映射解析(一)—— 基本映射