例如:一个大型的配送单包含如下信息:
-订购客户姓名
-所订购的货物品名,数量等
-配送单编号,配送地址,时间等。
但是这种设计方案并不可取,可将此方案划分为如下3个对象:
Invoice 配送单
Item 订购项目
Person 客户
这就是细粒度划分。
很明显,通过合理的细粒度划分,体现出了更清晰合理的设计逻辑。
对于表的对象细分,在Hibernate中可借助Component节点定义实现。
Component与实体对象的根本区别就在于Component没有标识(identity),她只是一个逻辑组成,
完全从属于实体对象。
先看person表结构:
id int
firetname varchar(50)
lastname varchar(50)
address varchar(200)
zipcode varchar(10)
tel varchar(20)
看上面person表结构,不难发现,我们还可以分为名字和联系方式2个部分。
这时我们就可以对person表进行细粒度划分了。原则就是姓名和联系方式。
但是请大家注意,所谓细粒度划分,是指在POJO类上面向对象的划分,而不是在表的划分上。
下面就进行具体的细粒度划分步骤:
首先建立如上结构的person数据库表,
然后就是先建立如下两个类name和Contact:
package org.lxh.hibernate;
public class Name {
private String firstname ;
private String lastname ;
public String getFirstname() {
return firstname;
}
public void setFirstname(String firstname) {
this.firstname = firstname;
}
public String getLastname() {
return lastname;
}
public void setLastname(String lastname) {
this.lastname = lastname;
}
}
和
package org.lxh.hibernate;
public class Contact {
private String address ;
private String zipcode ;
private String tel ;
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
}
再建立person表的POJO类Person.java:
package org.lxh.hibernate;
public class Person {
// 在本类中要包含Name和Contact对象
private int id ;
private Name name ;
private Contact contact ;
public Contact getContact() {
return contact;
}
public void setContact(Contact contact) {
this.contact = contact;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Name getName() {
return name;
}
public void setName(Name name) {
this.name = name;
}
}
现在打开数据库连接,配置并修改映射文件Person.hbm.xml为:
注意Hibernate是借助Component节点定义实现细粒度划分实体映射的。具体如下:
<class name="Person" table="PERSON">
<id name="id" column="ID" type="int">
<generator class="assigned" />
</id>
<component name="name" class="org.lxh.hibernate.Name">
<property name="firstname" column="FIRSTNAME" type="string" not-null="true" />
<property name="lastname" column="LASTNAME" type="string" not-null="true" />
</component>
<component name="contact" class="org.lxh.hibernate.Contact">
<property name="address" column="ADDRESS" type="string" not-null="true" />
<property name="zipcode" column="ZIPCODE" type="string" not-null="true" />
<property name="tel" column="TEL" type="string" />
</component>
</class>
现在基本操作都已做完了。如果你还想写个操作验证一下,可按如下步骤做:
package org.lxh.hibernate;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class PersonOperate {
private Session session ;
public PersonOperate()
{
Configuration config = new Configuration().configure() ;
SessionFactory factory = config.buildSessionFactory() ;
this.session = factory.openSession() ;
}
// 测试增加操作
public void insert(Person p)
{
// 将数据存放到数据库之中
this.session.save(p) ;
// 事务提交
this.session.beginTransaction().commit() ;
}
// 取得全部数据
public List queryAll()
{
String hql = "FROM Person as p" ;
Query q = this.session.createQuery(hql) ;
List l = q.list() ;
return l ;
}
}
package org.lxh.hibernate;
import java.util.Iterator;
import java.util.List;
public class TestDemo {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
PersonOperate po = new PersonOperate() ;
/*
Person p = new Person() ;
Name n = new Name() ;
Contact c = new Contact() ;
p.setId(1) ;
n.setFirstname("李") ;
n.setLastname("兴华") ;
c.setAddress("www.mldn.cn") ;
c.setZipcode("10000") ;
c.setTel("666666") ;
p.setName(n) ;
p.setContact(c) ;
po.insert(p) ;
*/
List l = po.queryAll() ;
Iterator iter = l.iterator() ;
while(iter.hasNext())
{
Person p = (Person)iter.next() ;
System.out.println("ID --> "+p.getId()) ;
System.out.println("FIRSTNAME --> "+p.getName().getFirstname()) ;
System.out.println("LASTNAME --> "+p.getName().getLastname()) ;
System.out.println("ADDRESS --> "+p.getContact().getAddress()) ;
System.out.println("ZIPCODE --> "+p.getContact().getZipcode()) ;
System.out.println("TEL --> "+p.getContact().getTel()) ;
System.out.println("-------------------------------------------------") ;
}
}
}