读书人

hibernate之面临设计的细分

发布时间: 2012-09-01 09:33:03 作者: rapoo

hibernate之面向设计的细分

在Hibernate中,常常会听见:“fine-grained object model”,大致上是”适当的细粒度对象模型“;何为“适当的”?怎么才算的上是适当的,分寸的拿捏很大程度上取决与系统本身的特性,及设计者对应用逻辑的理解和项目经验的积累;何为“细粒度”?将原本业务逻辑中的对象加以细分,从而得到更加精细的对象模型(划分出更多的对象),在计算机世界中,有这样一句话:再复杂的系统,也就是由1和0组成;总而言之,对于hibernate来言,所谓的细粒度对象模型,主要针对实体类设计的对象细分,对象的细分出于2个目的:1.面向设计的粒度细分,通过对对想更精细的划分,从而更加清晰的展现系统逻辑;2.面向性能的粒度细分,针对业务逻辑,通过合理的细粒度对象,提供系统的能耗比(性能/资源消耗);

?

面向设计的粒度细分Component

?

对于单表的对象细分,在Hibernate中可以借助Component节点的定义完成;Component可翻译为:组件!就是从属某一整体的一个组成部分,在Hibernate中,可以根据某个实体对象中的一个逻辑组成称为Component;Component与实体对象的差别在于:Component没有标识,而实体对象有标识;因为Component是完全从属于实体对象的;

比如:一个门户网站中的用户管理,用户信息可分为:登录时所需要的帐号密码,用户的基本信息,和一些比较大型的属性如:用户的图像,个人简介(还可用继续往下分)!这个大的实体对象中就包含了3个逻辑组成部分:1.账户密码;2.基本信息;3.用户的大字段(图像,个人简介...)

例:TUser这样:

?

public class TUser implements java.io.Serializable {private static final long serialVersionUID = 1L;private Integer tId;private String tName;private String pwd;private TUserBase userBase;private TUserImg userImg;get()/set()}
?

?

?

其中的将TuserBase和TuserImg分开了:TuserBase:

?

public class TUserBase implements java.io.Serializable{private static final long serialVersionUID = 1L;private String realName;private String sex;private String age;        get()/set()}

?

?TUserImg:

?

import java.sql.Blob;import java.sql.Clob;public class TUserImg implements java.io.Serializable{private static final long serialVersionUID = 1L;private Blob image;private Clob info;        get()/set()}

?

?写下测试类:

?

public static void saveTest() throws Exception {Session session = HibernateUtil.getSessionFactory().getCurrentSession();session.beginTransaction();TUser tuser = new TUser();tuser.settName("root");tuser.setPwd("keith");TUserBase userBase = new TUserBase();userBase.setAge("21");userBase.setRealName("kejianjun");userBase.setSex("man");TUserImg userImg = new TUserImg();FileInputStream img = new FileInputStream("/home/keith/桌面/hankouku.jpg");Blob bimg = Hibernate.createBlob(img);userImg.setImage(bimg);Clob info = Hibernate.createClob("to many info..................");userImg.setInfo(info);tuser.setUserBase(userBase);tuser.setUserImg(userImg);session.save(tuser);session.getTransaction().commit();}

?

?看下日志文件:这是其中的建表SQL;

?

    create table TUser (        tId integer not null auto_increment,        tName varchar(255),        pwd varchar(255),        realName varchar(255),        sex varchar(255),        age varchar(255),        image longblob,        info longtext,        primary key (tId)    )

?

?看下添加的SQL:

?

Hibernate: insert into TUser  (tName, pwd, realName, sex, age, image, info) values  (?, ?, ?, ?, ?, ?, ?)

当然,在实际开发中并不会像上面那么设计,只是一个简单的例子而已!

?面向性能的粒度细分

第二个目的就是针对性能的细分,比如登录的时候,我只需要登录即可,详细信息或者是一些重量级的信息时,如果我不发送请求就不会去数据库里查询,可以提高系统的能耗比;在hibernate3中提供了延迟加载也可称为“懒加载”;

在配置文件中可以这样:

?

<property name="summary" not-null="true" length="200" lazy="true"/>

?这是hibernate文档中的例子,可以做下实验,so Easy的!

?

?

读书人网 >软件架构设计

热点推荐