在Hibernate的世界中,术语"fine-grained object model",大致意思就是"适当的细粒度对象模型",这句是抄来的..英文不好..见谅啊..
所谓的"细粒度对象模型"是指在业务模型的对象上加以细分,得到更多的业务模型对象,说白了就是就把一个对象分成几个对象
对hibernate而言,主要是针对实体类设计的对象细分,对象的细分主要出于两种目的
1.面向设计的粒度细分
通过对象的细化,实现更加清晰的系统逻辑
2.面向性能的粒度细分
针对业务逻辑,通过合理的细粒度对象,提高系统的能耗比(性能/资源消耗)
我们还是来看代码比较亲切
首先我们有张Person的表
CREATE TABLE person
(
id int not null primary key ,
firstname varchar(20) not null ,
lastname varchar(20) not null ,
address varchar(20) not null ,
zipcode varchar(6) not null ,
tel varchar(20)
) ;
commit;
从上面看..我们是不是可以把person表分成3块:id,name,contact;
Name --> firstname,lastname
Contact --> address,zipcode,tel
那么我们首先得有个Name的POJO类,他下面有firstname,lastname这两个属性,
private String firstname;
private String lastname;
然后我们再创建Contact的POJO类,他下面有 address,zipcode,tel这三个属性
private String address;
private String zipcode;
private String tel;
然后就是我们的Person类了,他有id,Name,Contact这三个属性
private int id;
private Name name;
private Contact contact;
要对对象的细分..在hibernate可以借助Component来完成
Component在hibernate的语义中是,是将某个逻辑对象中的一个逻辑组成称为一个Component
Component与实体对象的根本差别,就在于Component没有标识(identity),他做为一个逻辑组成,完全从属于实体对象
Person.hbm.xml
<class name="org.luna.hibernate.demo.Person" table="PERSON"
schema="SCOTT">
<id name="id" type="int">
<column name="ID" precision="22" scale="0" />
<generator class="assigned" />
</id>
<!-- 这里是Name-->
<component name="name" class="org.luna.hibernate.demo.Name">
<property name="firstname" type="java.lang.String">
<column name="FIRSTNAME" length="20" not-null="true" />
</property>
<property name="lastname" type="java.lang.String">
<column name="LASTNAME" length="20" not-null="true" />
</property>
</component>
<!-- 这里是contact-->
<component name="contact"
class="org.luna.hibernate.demo.Contact">
<property name="address" type="java.lang.String">
<column name="ADDRESS" length="20" not-null="true" />
</property>
<property name="zipcode" type="java.lang.String">
<column name="ZIPCODE" length="20" not-null="true" />
</property>
<property name="tel" type="java.lang.String">
<column name="TEL" length="20" />
</property>
</component>
</class>
然后我们写一个类
PersonOperate.java
public class PersonOperate {
private Session session = null;
public PersonOperate(){
session = new Configuration().configure().buildSessionFactory().openSession();
}
public void insert(Person p){
session.save(p);
session.beginTransaction().commit();
}
public List queryAll(){
List l = null;
String hql = "FROM Person as p";
l = session.createQuery(hql).list();
return l;
}
}
在上面我们有插入和查询全部,然后我们通过一个Test类测试一下吧
public class Test {
public static void main(String[] args) {
// 这里是插入的代码
// PersonOperate po = new PersonOperate();
// Person person = new Person();
// Name name = new Name();
// Contact contact = new Contact();
//
// name.setFirstname("Stone");
// name.setLastname("Luna");
//
// contact.setAddress("Luna_Kiss_Moon");
// contact.setZipcode("100000");
// contact.setTel("123123");
//
// person.setName(name);
// person.setContact(contact);
// person.setId(1);
//
// po.insert(person);
//查询所以数据并打印到控制台
PersonOperate po = new PersonOperate();
List l = po.queryAll();
Iterator iterator = l.iterator();
while(iterator.hasNext()){
Person p = (Person)iterator.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());
}
}
从上面的代码中可以看出,我们在hibernate中完成了对表的对象的细分
所谓的"细粒度对象模型"是指在业务模型的对象上加以细分,得到更多的业务模型对象,说白了就是就把一个对象分成几个对象
对hibernate而言,主要是针对实体类设计的对象细分,对象的细分主要出于两种目的
1.面向设计的粒度细分
通过对象的细化,实现更加清晰的系统逻辑
2.面向性能的粒度细分
针对业务逻辑,通过合理的细粒度对象,提高系统的能耗比(性能/资源消耗)
我们还是来看代码比较亲切
首先我们有张Person的表
CREATE TABLE person
(
id int not null primary key ,
firstname varchar(20) not null ,
lastname varchar(20) not null ,
address varchar(20) not null ,
zipcode varchar(6) not null ,
tel varchar(20)
) ;
commit;
从上面看..我们是不是可以把person表分成3块:id,name,contact;
Name --> firstname,lastname
Contact --> address,zipcode,tel
那么我们首先得有个Name的POJO类,他下面有firstname,lastname这两个属性,
private String firstname;
private String lastname;
然后我们再创建Contact的POJO类,他下面有 address,zipcode,tel这三个属性
private String address;
private String zipcode;
private String tel;
然后就是我们的Person类了,他有id,Name,Contact这三个属性
private int id;
private Name name;
private Contact contact;
要对对象的细分..在hibernate可以借助Component来完成
Component在hibernate的语义中是,是将某个逻辑对象中的一个逻辑组成称为一个Component
Component与实体对象的根本差别,就在于Component没有标识(identity),他做为一个逻辑组成,完全从属于实体对象
Person.hbm.xml
<class name="org.luna.hibernate.demo.Person" table="PERSON"
schema="SCOTT">
<id name="id" type="int">
<column name="ID" precision="22" scale="0" />
<generator class="assigned" />
</id>
<!-- 这里是Name-->
<component name="name" class="org.luna.hibernate.demo.Name">
<property name="firstname" type="java.lang.String">
<column name="FIRSTNAME" length="20" not-null="true" />
</property>
<property name="lastname" type="java.lang.String">
<column name="LASTNAME" length="20" not-null="true" />
</property>
</component>
<!-- 这里是contact-->
<component name="contact"
class="org.luna.hibernate.demo.Contact">
<property name="address" type="java.lang.String">
<column name="ADDRESS" length="20" not-null="true" />
</property>
<property name="zipcode" type="java.lang.String">
<column name="ZIPCODE" length="20" not-null="true" />
</property>
<property name="tel" type="java.lang.String">
<column name="TEL" length="20" />
</property>
</component>
</class>
然后我们写一个类
PersonOperate.java
public class PersonOperate {
private Session session = null;
public PersonOperate(){
session = new Configuration().configure().buildSessionFactory().openSession();
}
public void insert(Person p){
session.save(p);
session.beginTransaction().commit();
}
public List queryAll(){
List l = null;
String hql = "FROM Person as p";
l = session.createQuery(hql).list();
return l;
}
}
在上面我们有插入和查询全部,然后我们通过一个Test类测试一下吧
public class Test {
public static void main(String[] args) {
// 这里是插入的代码
// PersonOperate po = new PersonOperate();
// Person person = new Person();
// Name name = new Name();
// Contact contact = new Contact();
//
// name.setFirstname("Stone");
// name.setLastname("Luna");
//
// contact.setAddress("Luna_Kiss_Moon");
// contact.setZipcode("100000");
// contact.setTel("123123");
//
// person.setName(name);
// person.setContact(contact);
// person.setId(1);
//
// po.insert(person);
//查询所以数据并打印到控制台
PersonOperate po = new PersonOperate();
List l = po.queryAll();
Iterator iterator = l.iterator();
while(iterator.hasNext()){
Person p = (Person)iterator.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());
}
}
从上面的代码中可以看出,我们在hibernate中完成了对表的对象的细分