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文件:
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
Users may bid for or sell auction items.
column="id"
type="int">
not-null="true"
column="username"
type="string"/>
not-null="true"
column="password"
type="string"
/>
not-null="true"
column="phone"
type="string"
/>
not-null="true"
column="email"
type="string"
/>
not-null="true"
column="address"
type="string"
/>
not-null="true"
column="sex"
type="string"
/>
然后再建立实体类:
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;
}
}
下面对这份映射文件做个分析:
1.类表应射配置:
name指定了映射类名。
table指定了所对应的数据库表
2.id映射配置
name指定当前映射类中的属性:id,它对应了数据库表reg表中的主键字段
column指定了当前映射表reg的唯一标识为id这个字段。
type指定了当前字段的数据类型
generator指定了主键的生成方式,关于hiber中的主键生成机制这里有相关的介绍,大家可
以看看:http://blog.csdn.net/watano_cc/archive/2006/02/28/612286.aspx
3.属性/数据库字段映射配置:
not-null="true"
column="address"
type="string"/>
相信这个就不用相细介绍了吧?大家看看就明白了
最后我们说一下路径问题,
.hbm.xml文件默认放在实体类所产生的class文件所在的包中。这样一个完整的o/r映射就建
立了,其实问题的关键不在操作本身,而在于思路是否清晰,只要思路清晰,那么按照别人
讲给的配置方法,操作肯定能成功。