技术开发 频道

hibernate O/R映射之基础

  【IT168 技术文档】hibernate(以下简称hiber)的第一编学习终于结束了。学习的过程中,总结出来一些经验及学习的笔记,特拿出来与大家共享之,由于我能力有限,不能对hiber做到精通,所以还请大家鉴别,如发现有什么错误,还望不吝指教,在此谢谢各位达人的斧正。学hiber的过程中,我买了本书:《深入浅出hibernate》,夏昕,曹晓刚,唐勇合著的,自我感觉书写的不错,真正的做到了深入浅出。但不足之处鄙人觉得事例太少,实战不佳。需要大家自己多想办法来实现一些应用,只有这样才能真正的体会其中之精髓,为己所用。

  刚接触hiber的时候,在网上找了篇如何学习hiber的文章,认真品读后,牢记作者说的不能为了学习hiber而学习,而应该从更高层次的去理解它的内涵。这篇文章咱jr上也有http://www.javaresearch.org/article/24993.htm,大家在学习的时候可以看看。

  hiber的主要任务是实现数据的持久层操作,而何谓持久层?可以理解为:在系统逻辑的层面上,专注于实现数据持久化的一个相对独立的领域。hiber所要完成的是实现在这个领域中的数据操作,而这个完成并不是一般的只要实现最终目的就算完成的完成,它所追求的性能消耗小,耦合度小,数据封装性强等等才是它真正意义上的完成数据的持久层操作。

  hiber的基础配置及使用在此不再多讲,如果你准备好了学hiber这些不是你的障碍。下面我们讨论真正属于障碍的部分。hiber的o/r映射o:object,r:relational。放在一起就是对象 关系。而hiher本身应该算是java的面向对象特性与传统关系型数据之间矛盾的产物。又基于对web及hiber的基础性了解,那么o/r映射无疑就成了orm框架中最为关键的内容。

  在学习or映射之前,我们要先对hiber的基本数据类型有所了解。

  实体映射技术作为类与表之间的联系纽带,在orm实现中起着至关重要的作用。对于hiber用户而言,映射关系更多的体现在配置文件的维护过程中。hiber选用xml作为其映射配置文件的好处自不用说,只要对xml知识有所了解,大家就可以体会到这一点。

  我们在配置o/r映射的时候,首先是

  1.类名与表名的映射,

  2.接着是主键映射,

  3.最后是字段映射。

  一个完整o/r映射建立的基础是数据库表的存在,然后由数据库表产生类表映射配置媒介.hbm.xml文件。最后写出实体类,即由数据库表映射出来的java类。

  我这里有一份完整的o/r映射,大家可以看一下:

  按照上面的步骤,首先有数据库表:

  CREATE TABLE reg (   Id int(6) unsigned NOT NULL auto_increment,   username varchar(16) default NULL,   password varchar(20) default NULL,   phone int(11) default NULL,   email varchar(30) default NULL,   address varchar(50) default NULL,   sex varchar(4) default NULL,   PRIMARY KEY (Id)   ) ENGINE=InnoDB DEFAULT CHARSET=gbk;

  在数据表的基础上建立.hbm.xml文件:

  < ?xml version="1.0" encoding="UTF-8"?>   < !DOCTYPE hibernate-mapping PUBLIC   "-//Hibernate/Hibernate Mapping DTD 3.0//EN"   "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">   < hibernate-mapping>   < class name="mypack.Customer" table="reg">   < comment>Users may bid for or sell auction items.< /comment>   < id name="id"   column="id"   type="int">   < generator class="native"/>   < /id>   < property name="username"   not-null="true"   column="username"   type="string"/>   < property name="password"   not-null="true"   column="password"   type="string"   />   < property name="phone"   not-null="true"   column="phone"   type="string"   />   < property name="email"   not-null="true"   column="email"   type="string"   />   < property name="address"   not-null="true"   column="address"   type="string"   />   < property name="sex"   not-null="true"   column="sex"   type="string"   />   < /class>   < /hibernate-mapping>

  然后再建立实体类:

  package mypack;   import java.io.Serializable;   public class Customer implements Serializable{   private int id;   private String username;   private String email;   private String password;   private String phone;   private String sex;   private String address;   public Customer(){}   public int getId(){   return id;   }   public void setId(int id){   this.id=id;   }   public String getUsername(){   return this.username;   }   public void setUsername(String username){   this.username=username;   }   public String getPassword(){   return password;   }   public void setPassword(String password){   this.password=password;   }   public String getPhone(){   return this.phone;   }   public void setPhone(String phone){   this.phone=phone;   }   public String getEmail(){   return email;   }   public void setEmail(String email){   this.email=email;   }   public String getAddress(){   return this.address;   }   public void setAddress(String address){   this.address=address;   }   public String getSex(){   return this.sex;   }   public void setSex(String sex){   this.sex=sex;   }   }   < class name="mypack.Customer" table="reg">

  下面对这份映射文件做个分析:

  1.类表应射配置:

  < class name="mypack.Customer" table="reg">

  name指定了映射类名。

  table指定了所对应的数据库表

  2.id映射配置

  < id name="id" column="id" type="int">

  < generator class="native"/>

  < /id>

  name指定当前映射类中的属性:id,它对应了数据库表reg表中的主键字段

  column指定了当前映射表reg的唯一标识为id这个字段。

  type指定了当前字段的数据类型

  generator指定了主键的生成方式,关于hiber中的主键生成机制这里有相关的介绍,大家可以看看:http://blog.csdn.net/watano_cc/archive/2006/02/28/612286.aspx

  3.属性/数据库字段映射配置:

  < property name="address"   not-null="true"   column="address"   type="string"/>

  相信这个就不用相细介绍了吧?大家看看就明白了[:)]

  最后我们说一下路径问题,.hbm.xml文件默认放在实体类所产生的class文件所在的包中。这样一个完整的o/r映射就建立了,其实问题的关键不在操作本身,而在于思路是否清晰,只要思路清晰,那么按照别人讲给的配置方法,操作肯定能成功。

0
相关文章