掌握实体粒度划分的主要作用以及两种实现(*.hbm.xml,anntation)
实体粒度划分的意义
在整个Hibernate技术应用之中,基本的流程,要提供有一个POJO类,而后要提供有一个POJO.hbm.xml文件,但是如果说现在假设有如下一种情况出现.
创建web项目:HibernateCompnent
创建数据库
如果按照正常的思路,那么此时生成的POJO类的结构如下:
package cn.zwb.pojo;
import java.util.Date;
/**
* Member entity. @author MyEclipse Persistence Tools
*/
public class Member implements java.io.Serializable {
// Fields
private String mid;
private String name;
private Integer age;
private Double salary;
private Date birthday;
private String note;
// Constructors
/** default constructor */
public Member() {
}
/** minimal constructor */
public Member(String mid) {
this.mid = mid;
}
/** full constructor */
public Member(String mid, String name, Integer age, Double salary, Date birthday, String note) {
this.mid = mid;
this.name = name;
this.age = age;
this.salary = salary;
this.birthday = birthday;
this.note = note;
}
// Property accessors
public String getMid() {
return this.mid;
}
public void setMid(String mid) {
this.mid = mid;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return this.age;
}
public void setAge(Integer age) {
this.age = age;
}
public Double getSalary() {
return this.salary;
}
public void setSalary(Double salary) {
this.salary = salary;
}
public Date getBirthday() {
return this.birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getNote() {
return this.note;
}
public void setNote(String note) {
this.note = note;
}
}
这样有人会提出以上的设计方式不适合于面向对象的应用形式,从面向对象的角度来看以上的Member的组成应该分为:Member,MemberBasic,MemberContarct.而每个类的作用如下:
MemberBasic:name age birthday
MemberContarct:node salay
Member:mid MemberBasic MemberContarct
基于*.hbm.xml文件实现细粒度划分
虽然现在有一张Member表,但是却发现有三个实体类,并且这些实体类之间是存在引用关系的,而要使用Hibernate开发,就必须将这些关系在配置文件中进行展示.
所以重点就在于配置文件的编写上
范例:在Member.hbm.xml文件之中实现配置
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 不管任何操作每一个*.hbm.xml文件只POJO类关联 -->
<class name="cn.zwb.pojo.Member" table="member" catalog="aaa">
<id name="mid" type="java.lang.String">
<column name="mid" length="50" />
<generator class="assigned"></generator>
</id>
<component name="basic" class="cn.zwb.pojo.MemberBasic">
<property name="name" type="java.lang.String">
<column name="name" length="50" />
</property>
<property name="age" type="java.lang.Integer">
<column name="age" />
</property>
</component>
<property name="birthday" type="java.util.Date">
<column name="birthday" length="10" />
</property>
<!-- 此处配置Contarct属性的类型以及包含的内容 -->
<component name="Contarct" class="cn.zwb.pojo.MemberContarct">
<property name="note" type="java.lang.String">
<column name="note" length="65535" />
</property>
<property name="salary" type="java.lang.Double">
<column name="salary" precision="22" scale="0" />
</property>
</component>
</class>
</hibernate-mapping>
配置完成之后下面直接使用程序进行测试.
范例:编写增加操作
package cn.zwb.test;
import java.util.Date;
import cn.zwb.dbc.HibernateSessionFactory;
import cn.zwb.pojo.Member;
public class TestMemberInsert {
public static void main(String[] args) {
Member vo =new Member();
vo.setMid("zwb1");
vo.getBasic().setName("你好");
vo.getBasic().setAge(21);
vo.getBasic().setBirthday(new Date());
vo.getContarct().setNote("啊啊啊");
vo.getContarct().setSalary(11.0);
HibernateSessionFactory.getSession().save(vo);
HibernateSessionFactory.getSession().beginTransaction().commit();
}
}
现在虽然是属于不同的类型,但是在最终生成的时候还是使用了一条sql语句
编写查询操作
package cn.zwb.test;
import cn.zwb.dbc.HibernateSessionFactory;
import cn.zwb.pojo.Member;
public class TestMemberGet {
public static void main(String[] args) {
Member vo =HibernateSessionFactory.getSession().get(Member.class, "zwb1");
HibernateSessionFactory.getSession().beginTransaction().commit();
HibernateSessionFactory.closeSession();
System.out.println(vo);
}
}
此时虽然只发出了一条查询语句,按时查询之后的数据都已经各自保存到各自对象之中
基于Annotation的配置
如果真的要使用了实体的细粒度划分,那么还是HBM的配置方式省事,而Annotation的配置太麻烦了略