`
zisefeiniao
  • 浏览: 174066 次
  • 性别: Icon_minigender_2
  • 来自: 成都
社区版块
存档分类
最新评论
阅读更多
假设有一个商品管理项目。

商品只有以下两类:1、书。 2、DVD

有以下共通的属性:编号,标题,价格

书包含自己单独的属性:页数

DVD包含自己单独的属性:时间长度



类的设计为:

三个类:商品类、子类书类、子类DVD类



一、两张表
2张表:书表和DVD表,通过单独操作书与DVD来完成管理操作。

该设计与父类和子类无关,只是通过操作单独的子类来完成功能。



二、三张表
商品表:编号,标题,价格

书表:商品编号,页数

DVD表:商品编号,时间长度



1、建立数据库
DROP TABLE item ;

DROP TABLE book ;

DROP TABLE dvd ;



CREATE TABLE item (

    id            int           primary key auto_increment ,

    title         varchar(20)       not null,

    price         double        not null

);



CREATE TABLE book (

    id            int           primary key ,

    page          int           not null

);



CREATE TABLE dvd (

    id            int           primary key ,

    time_length       double        not null

);




2、生成映射
只需要生成item表的映射,另外两个类手工编写,并且编写过程中不需要加入book和dvd的映射关系文件。

package org.liky.pojo;







public class Item implements java.io.Serializable {



    // Fields



    private Integer id;



    private String title;



    private Double price;



    // Constructors



  

    public Item() {

    }



  

    public Item(String title, Double price) {

       this.title = title;

       this.price = price;

    }



    // Property accessors



    public Integer getId() {

       return this.id;

    }



    public void setId(Integer id) {

       this.id = id;

    }



    public String getTitle() {

       return this.title;

    }



    public void setTitle(String title) {

       this.title = title;

    }



    public Double getPrice() {

       return this.price;

    }



    public void setPrice(Double price) {

       this.price = price;

    }



}




建立Book类



package org.liky.pojo;



public class Book extends Item {



    private int page;



    public int getPage() {

       return page;

    }



    public void setPage(int page) {

       this.page = page;

    }



}


建立DVD类

package org.liky.pojo;



public class Dvd extends Item {



    private double timeLength;



    public double getTimeLength() {

       return timeLength;

    }



    public void setTimeLength(double timeLength) {

       this.timeLength = timeLength;

    }






3、修改映射文件
修改映射文件,加入子类配置

<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!--

    Mapping file autogenerated by MyEclipse Persistence Tools

-->

<hibernate-mapping>

    <class name="org.liky.pojo.Item" table="item" catalog="testdb">

       <id name="id" type="java.lang.Integer">

           <column name="id" />

           <generator class="native" />

       </id>

       <property name="title" type="java.lang.String">

           <column name="title" length="20" not-null="true" />

       </property>

       <property name="price" type="java.lang.Double">

           <column name="price" precision="22" scale="0"

              not-null="true" />

       </property>

       <!-- 表示Item类包含一个子类为Book,Book类与book表有对应关系 -->

       <joined-subclass name="org.liky.pojo.Book" table="book">

           <!-- 表示在book表中是通过id字段与item表建立关联关系的 -->

           <key column="id"></key>

           <!-- 表示Book类中的page属性与book表中的page字段有对应关系 -->

           <property name="page" type="java.lang.Integer">

              <column name="page" not-null="true"></column>

           </property>

       </joined-subclass>



       <joined-subclass name="org.liky.pojo.Dvd" table="dvd">

           <key column="id"></key>

           <property name="timeLength" type="java.lang.Double">

              <column name="time_length" not-null="true"></column>

           </property>

       </joined-subclass>

    </class>

</hibernate-mapping>




4、编写后台代码
只建立Item类的DAO接口等操作



5、测试
       // 插入书

       // Book book = new Book();

       // book.setTitle("哈里波特");

       // book.setPrice(32.5);

       // book.setPage(500);

       //   

       // try {

       // itemdao.doCreate(book);

       // } catch (Exception e) {

       // // TODO Auto-generated catch block

       // e.printStackTrace();

       //     }

     

       // 插入DVD

       Dvd dvd = new Dvd();

       dvd.setTitle("终结者");

       dvd.setPrice(5.0);

       dvd.setTimeLength(2.0);

     

       try {

           itemdao.doCreate(dvd);

       } catch (Exception e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

       try {

           List all = itemdao.findAll(1, 10);

           Iterator iter = all.iterator();

           while (iter.hasNext()) {

              Item item = (Item) iter.next();

              if (item instanceof Book) {

                  Book book = (Book)item;

                  System.out.println(book.getTitle() + " --> " +book.getPage());

              } else if (item instanceof Dvd) {

                  Dvd dvd = (Dvd) item;

                  System.out.println(dvd.getTitle() + " --> " +dvd.getTimeLength());

              }

           }

       } catch (Exception e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }


查询性能非常低,因此绝对不使用。



三、一张表
1张表:只有一个Item表

Item表:编号、标题、价格、页数、时间长度、标志位



1、建立表
DROP TABLE item ;

DROP TABLE book ;

DROP TABLE dvd ;



CREATE TABLE item (

    id            int           primary key auto_increment ,

    title         varchar(20)       not null,

    price        double        not null,

    page          int           ,

    time_length       double        ,

    flag          varchar(20)       not null 

);


标志位使用varchar类型,会由Hibernate自动进行处理



2、生成映射类


3、修改映射文件
<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<!--

    Mapping file autogenerated by MyEclipse Persistence Tools

-->

<hibernate-mapping>

    <class name="org.liky.pojo.Item" table="item" catalog="testdb">

       <id name="id" type="java.lang.Integer">

           <column name="id" />

           <generator class="native" />

       </id>

       <!-- 定义标志位的值,标志位对应的字段为flag,其类型按照String类型处理 -->

       <discriminator column="flag"></discriminator>

       <property name="title" type="java.lang.String">

           <column name="title" length="20" not-null="true" />

       </property>

       <property name="price" type="java.lang.Double">

           <column name="price" precision="22" scale="0"

              not-null="true" />

       </property>     

       <!-- 表示Item类包含一个子类Book,如果操作Book时,标志位的值为book -->

       <subclass name="org.liky.pojo.Book" discriminator-value="book">         

           <property name="page" type="java.lang.Integer">

              <column name="page"></column>

           </property>

       </subclass>

       <!-- 表示Item类包含一个子类Dvd,如果操作Dvd时,标志位的值为dvd -->

       <subclass name="org.liky.pojo.Dvd" discriminator-value="dvd">      

           <property name="timeLength" type="java.lang.Double">

              <column name="time_length"></column>

           </property>

       </subclass>

     

    </class>

</hibernate-mapping>






4、测试
其他的任何后台代码都不需要修改,Hibernate会自行处理。

       // 插入书

       // Book book = new Book();

       // book.setTitle("哈里波特");

       // book.setPrice(32.5);

       // book.setPage(500);

       //

       // try {

       // itemdao.doCreate(book);

       // } catch (Exception e) {

       // // TODO Auto-generated catch block

       // e.printStackTrace();

       //     }



        // 插入DVD

       // Dvd dvd = new Dvd();

       // dvd.setTitle("终结者");

       // dvd.setPrice(5.0);

       // dvd.setTimeLength(2.0);

       //

       // try {

       // itemdao.doCreate(dvd);

       // } catch (Exception e) {

       // // TODO Auto-generated catch block

       // e.printStackTrace();

       //     }



        try {

           List all = itemdao.findAll(1, 10);

           Iterator iter = all.iterator();

           while (iter.hasNext()) {

              Item item = (Item) iter.next();

              if (item instanceof Book) {

                  Book book = (Book) item;

                  System.out.println(book.getTitle() + " --> "

                         + book.getPage());

              } else if (item instanceof Dvd) {

                  Dvd dvd = (Dvd) item;

                  System.out.println(dvd.getTitle() + " --> "

                         + dvd.getTimeLength());

              }

           }

       } catch (Exception e) {

           // TODO Auto-generated catch block

           e.printStackTrace();

       }

要使用的话必然使用单表的这种方式。
分享到:
评论

相关推荐

    hibernate实体设计

    本文将围绕“Hibernate实体层设计”,介绍如何在MyEclipse环境中进行实体类的设计与配置,帮助读者快速上手并理解Hibernate的核心概念。 #### 二、实体设计基础 在开始之前,我们先明确几个基本概念: - **实体...

    Hibernate之实体层次设计

    本篇文章将深入探讨Hibernate中的实体层次设计,这是一个关键概念,它涉及到如何在数据库中表示类的继承结构。通过理解这些设计模式,开发者能够更好地管理和优化数据存储。 首先,我们来看“tablePerConcreteClass...

    Hibernate入门(代码+笔记)

    **第五部分:Hibernate实体层设计** 这部分将探讨如何优化实体层的设计,以提高应用的性能和可维护性。这包括懒加载(Lazy Loading)策略,通过延迟加载提高性能;级联操作(Cascade)可以将父对象的操作同步到子...

    hibernate

    ### Hibernate实体层设计 在Hibernate中,实体层是业务逻辑与数据库之间的桥梁。它由Java类和这些类的实例组成,这些类代表数据库中的表。实体类通常具有与数据库表对应的字段,并通过注解或XML配置文件与数据库表...

    JAVA框架核心技术笔记2 struts hibernate spring

    "19-Hibernate实体层设计笔记.pdf"和"23-26Hibernate数据关联技术笔记.pdf"至"32Hibernate数据关联技术_1vs1应用案例_笔记.pdf"涵盖了Hibernate的基本概念,包括实体类的设计、持久化、会话管理以及一对一、一对多和...

    hibernate生成实体类

    - 在生成实体类之前,建议先对数据库表进行一定的规范化处理,如合理设计字段、添加注释等,这样生成的实体类会更加规范易读。 - 生成的实体类默认可能包含所有字段的getter和setter方法,对于不需要持久化的字段...

    hibernate实体关联关系映射

    ### Hibernate实体关联关系映射详解 #### 一、引言 Hibernate作为一种强大的对象关系映射(Object Relational Mapping,简称ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了持久化层的开发工作,...

    java SSH框架架构学习_笔记.struts,spring,hibernate. IOC,AOP,JDBC,编写个留言管理系统网站

    在`13-Hibernate入门(上)笔记.pdf`至`19-Hibernate实体层设计笔记.pdf`中,详细介绍了Hibernate的配置、实体类的创建、映射文件的编写、HQL(Hibernate Query Language)的使用,以及如何处理复合主键等复杂情况。...

    javaEE框架笔记,识货人下

    19-Hibernate实体层设计笔记.pdf 2-JSP+JDBC_真分页(基于Oracle数据库分页)笔记.pdf 20-22Hibernate_容器映射技术笔记.pdf 23-26Hibernate数据关联技术笔记.pdf 27-32Hibernate数据关联技术_1vs1应用案例_笔记.pdf 3...

    J2EE核心框架代码2

    "19.Hibernate实体层设计"可能探讨了如何规划和设计实体类的层次结构,以适应业务需求和数据库模式。这通常包括实体间的继承、多态和复合等设计原则。 "25_26Hibernate数据关联(11、M1、1N、MN)(3)(4)"这部分...

    网上图书管理系统struts2+hibernate的课程设计实现

    每个模块都对应一个或多个Action,这些Action与Hibernate实体类进行交互,完成数据库操作。为了保证系统稳定性和安全性,还需要考虑异常处理、事务管理、权限控制等方面的设计。 **开发实践** 1. **环境搭建**:...

    hibernate程序设计

    【Hibernate程序设计】系列主要涵盖了Hibernate的各个方面,包括概述、对象-关系映射基础、复杂实体映射、关联映射以及查询技术。以下是对这些知识点的详细解释: 1. **Hibernate概述** - Hibernate是一个开源的...

    Hibernate封装dao层

    "Hibernate封装DAO层"就是将Hibernate的功能整合到DAO设计模式中,以实现更加高效、规范的数据库操作。 1. **DAO设计模式**: DAO模式是软件设计模式的一种,它的核心思想是创建一个独立于具体数据库操作的对象,...

    用HIBERNATE开发留言板系统的设计概要

    在使用Hibernate开发留言板系统时,我们需要考虑多个方面,包括系统功能设计、用户权限管理、数据库设计以及Hibernate框架的使用策略。以下是对这些方面的详细说明: ### 1. 系统功能设计 #### 1.1 创建用户 创建...

    Hibernate3.1_学习源码

    实体层设计:一个父类,两个子类,子类继承父类, 配置文件:只配置父类的映射文件,在其中加入joined-subclass将两个子类实体映射关系添加 2) 数据库表:一张表,包括公共字段、特有字段、区分字段 实体层设计...

    Hibernate 基于持久层框架的DAO模式应用

    在基于持久层框架的DAO(Data Access Object)模式应用中,Hibernate扮演着核心角色,使得业务逻辑和数据访问逻辑分离,提高了代码的可复用性和可维护性。 1. **DAO模式的理解** DAO模式是一种设计模式,它创建了...

Global site tag (gtag.js) - Google Analytics