hibernate O/R映射之基础

来源:互联网 发布:网络教育大专毕业证 编辑:程序博客网 时间:2024/05/16 01:50
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的基本数据类型有所了解。
http://hi.baidu.com/rufeizi/blog/item/243279f49db50dd9f2d385fb.html这个连接下面有

java数据类型与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映射就建
立了,其实问题的关键不在操作本身,而在于思路是否清晰,只要思路清晰,那么按照别人
讲给的配置方法,操作肯定能成功。  
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 小老鼠搬鸡蛋鸡蛋太大怎么办 小班走丢了怎么办教案 小班走丢了怎么办反思 房屋外墙漏水物业不管怎么办 厨房墙砖用色花怎么办 小孩子做错事很偏激怎么办 孩子在学校偷钱怎么办 房间墙壁上到处有湿虫怎么办 买了西晒的房子怎么办 墙面瓷砖下水管漏水怎么办 西晒房间开空调没效果怎么办 墙纸被小孩画了怎么办 集成墙板缝隙大怎么办 高血压变低血压怎么办会恢复吗 总是感觉睡不够好困怎么办 两岁宝宝说有鬼怎么办 阳台改成了卧室晒衣服怎么办 室外墙角边墙泥受潮脱落怎么办 新房装修墙体发霉了怎么办 宝宝吃多了发烧怎么办 宝宝睡觉不爱盖被子怎么办 1岁宝宝不盖被子怎么办 2岁宝宝不盖被子怎么办 买的芬琳漆不够刷的怎么办 1.3米宽厨房门怎么办 墙面漆颜色刷深了怎么办 地板上沾了墙漆怎么办 孩子连发高烧8天了怎么办 孩子对数字不敏感怎么办 三岁宝宝不爱学习怎么办 5岁还不认识数字怎么办 小孩上中班还不认识数字怎么办 中班小孩数字都不认识怎么办 中班小孩记不住数字怎么办 中班小孩不肯练数字描红怎么办 2个月吃母乳婴儿缺钙怎么办 月经期接吻水多怎么办 4岁宝宝晚上尿多怎么办 2岁宝宝晚上尿多怎么办 3岁宝宝晚上尿多怎么办 宝宝拉肚子拉绿色的屎怎么办