(十一)Hibernate实体粒度划分

掌握实体粒度划分的主要作用以及两种实现(*.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的配置太麻烦了



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值