hibernate O/R映射之基础

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映射就建
立了,其实问题的关键不在操作本身,而在于思路是否清晰,只要思路清晰,那么按照别人
讲给的配置方法,操作肯定能成功。  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值