您的位置:首页 > 数据库

常用的Hibernate的映射与数据库表的关系

2011-06-05 11:16 232 查看
学HIbernate快一个月了,怕以后对于Hibernate的诸多映射关系有所混乱,所以趁着还比较清晰的状态写下来。同时也希望对刚学Hibernate的同学有所帮助。

首先我们要明白什么是Hibernate,为什么要使用Hibernate?明白了这个问题更加有利于我们学好Hibernate,更加的了解Hibernate与数据库的关系。什么是Hibernate,官方这样解释:Hibernate is an object/relational mapping tool for Java environments. The term object/relational mapping (ORM) refers to the technique of mapping a data representation from an object model to a relational data model with a SQL-based schema.解释下,Hibernate是一种用于java环境的对象关联映射工具,所谓的(ORM)对象关联映射是一种基于SQL视图将对象模型转换为数据库表的技术(也就是将对象存储到数据库)。学过数据库原理的同学都知道,我们经常通过画实体联系图来确定创建哪些表,以及表与表之间的联系。明白了这一点,你也就很容易的想到为什么Hibernate会有这么多的映射关系了。Hibernate常用的映射有:一对多,多对一,多对多,一对一。至于为什么要使用Hibernate,基本上:

Hibernates goal is to relieve the developer from 95 percent of common data persistence related programming tasks. Hibernate may not be the best solution for data-centric applications that only use stored-procedures to implement the business logic in the database, it is most useful with object-oriented domain models and business logic in the Java-based middle-tier. However, Hibernate can certainly help you to remove or encapsulate vendor-specific SQL code and will help with the common task of result set translation from a tabular representation to a graph of objects.

大概的意思如下:Hibernate能够很好的将对象持久化(将对象存放进数据库),以及将针对与不同的SQL将数据库表中的记录提取出来转换成对象,以便减少程序员的工作量。

对于原理这种东西我就不多说了,一方面网上资料好多(有一定英文基础的,建议看英文文档),另一方面我也不大了解(说多了会露馅)。下面就分别来介绍下Hibernate中的关联关系映射,以及如何配置。(本文中在数据库中生成的表统一命名为t_***,即在对象前加入t_)

首先:多对一映射,就拿班级和学生两个对象来解释吧,一个班级可以有多个学生,每个学生只能属于一个班级。我们的目的是将这两个对象存放进数据库(生成两张表),并且这两者要表现出多对一的关系。想想,如果我们只是用SQL语句来操作的话,只需要简历两张表t_student,t_classes再在t_student表中加入一个字段也就是外键(假设是cid)用来表示当前学生是属于那个班级的。但是,我们现在是用Hibernate来创建表。现在在我们的项目中有两个类对象Student,Classes以及三个配置文件Classes.hbm.xml,Student.hbm.xml,hibernate.cfg.xml还有两段测试代码:ExoprtDB.java(用来创建表),TestManyToOne.java(用来对表进行增删改查)。Student对象有两个属性:name,id。Classes对象也有两个属性name,id。项目的结构如下图:

 



对于多对一的关联关系映射,我们主要在多的一方进行配置,也就是在Student.hbm.xml里面配置,先看配置,再解释,配置如下:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.fendou.hibernate">
<class name="Student" table="t_student">
<id name="id" column="sid">
<generator class="native"></generator>
</id>

<property name="name" length="50" column="sname"/>
<many-to-one name="classes" column="cid" cascade="save-update"/>
</class>
</hibernate-mapping>


在hibernate-mapping标签中的class就是我们要进行持久化的类,即生成数据库表。class标签中的name属性代表类名,table属性表示生成的数据库表名。id表示数据库表中的主键,当前我们使用的是Student对象的id属性作为表主键,主键的生成策略为native(自增长)。表中的字段还有sname(利用Student对象的name属性)。下面关键的就是<many-to-one>标签,这个标签告诉Hibernate当前使用的多对一映射,name和column表示在t_student表中会生成一个名叫cid字段,用来作为t_classes的外键,cascade表示级联。运行

ExoprtDB.java产生如下代码:

drop table if exists t_classes
drop table if exists t_student
create table t_classes (cid integer not null auto_increment, cname varchar(50), primary key (cid))
create table t_student (sid integer not null auto_increment, sname varchar(50), cid integer, primary key (sid))
alter table t_student add index FK4B907570D95D9B22 (cid), add constraint FK4B907570D95D9B22 foreign key (cid) references t_classes (cid)
这段代码相信大家一定是知道的。

(未完待续)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息