`

持久层上多态表现的三种策略 & oo数据库设计

阅读更多

 

Complete Class Model

 

 

Complete data model 

 

策略1:One table per subclass 

java 代码     (超类)
  1. @Entity  
  2. @Table(name="tb_person")   
  3. @Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)   
  4. public class Person implements Serializable{   
  5.        
  6.     Integer id;   
  7.        
  8.     @Id  
  9.     @Column(name="id")   
  10.     public Integer getId() {   
  11.         return id;   
  12.     }   
  13.     public void setId(Integer id) {   
  14.         this.id = id;   
  15.     }   
  16. }  

 

java 代码 (子类1)
  1. @Entity  
  2. @Table(name="tb_individual")   
  3. public class Individual extends Person {   
  4.        
  5.     String firstName;   
  6.     String lastName;   
  7.        
  8.     @Column(name="firstname")   
  9.     public String getFirstName() {   
  10.         return firstName;   
  11.     }   
  12.     public void setFirstName(String firstName) {   
  13.         this.firstName = firstName;   
  14.     }   
  15.     @Column(name="lastname")   
  16.     public String getLastName() {   
  17.         return lastName;   
  18.     }   
  19.     public void setLastName(String lastName) {   
  20.         this.lastName = lastName;   
  21.     }   
  22. }  

 

java 代码 (子类2)
  1. @Entity  
  2. @Table(name="tb_corporation")   
  3. public class Corporation extends Person{   
  4.   
  5.     String registerationNumber;   
  6.     String name;   
  7.        
  8.     @Column(name="name")   
  9.     public String getName() {   
  10.         return name;   
  11.     }   
  12.     public void setName(String name) {   
  13.         this.name = name;   
  14.     }   
  15.     @Column(name="registeration_number")   
  16.     public String getRegisterationNumber() {   
  17.         return registerationNumber;   
  18.     }   
  19.     public void setRegisterationNumber(String registerationNumber) {   
  20.         this.registerationNumber = registerationNumber;   
  21.     }   
  22. }  

从结构上来看这是一种依赖性比较强的数据库结构,3张表之间本身是独立的。而它们之间的关系却需要手动维护。

java 代码
  1. From Person  

这条查询语句返回的结果是3张表的集合 Person+Individual+Corporation。 但是值得商榷的是这个query语句会查询3个数据库,效率问题会是以后一个比较明显的问题。

java 代码
  1. From Corporation   

这条查询语句返回的结果就是1张表的内容 Corporation  

 

策略2: Single table per class hierarchy

java 代码
  1. @Entity  
  2. @Table(name="tb_right")   
  3. @Inheritance(strategy=InheritanceType.SINGLE_TABLE)   
  4. @DiscriminatorColumn(name="RIGHT_TYPE"  
  5.     ,discriminatorType=DiscriminatorType.STRING)   
  6.     @DiscriminatorValue("RIGHT_SUPER")   
  7. public class Right {   
  8.     Integer id;   
  9.     String name;   
  10.        
  11.     @Column(name="right_id")   
  12.     @GeneratedValue  
  13.     @Id  
  14.     public Integer getId() {   
  15.         return id;   
  16.     }   
  17.     public void setId(Integer id) {   
  18.         this.id = id;   
  19.     }   
  20.     @Column(name="right_name")   
  21.     public String getName() {   
  22.         return name;   
  23.     }   
  24.     public void setName(String name) {   
  25.         this.name = name;   
  26.     }   
  27. }  
java 代码
  1. @Entity  
  2. @Table(name="tb_right")   
  3. @DiscriminatorValue("LEASE_SUB")   
  4. public class Lease extends Right {   
  5.        
  6.     String leaseName;   
  7.     @Column(name="lease_name")   
  8.     public String getLeaseName() {   
  9.         return leaseName;   
  10.     }   
  11.     public void setLeaseName(String leaseName) {   
  12.         this.leaseName = leaseName;   
  13.     }   
  14.        
  15. }   
java 代码
  1. @Entity  
  2. @Table(name="tb_right")   
  3. @DiscriminatorValue("PROPERTY_SUB")   
  4. public class Property extends Right {   
  5.        
  6.     String name;   
  7.        
  8.     @Column(name="property_name")   
  9.     public String getName() {   
  10.         return name;   
  11.     }   
  12.     public void setName(String name) {   
  13.         this.name = name;   
  14.     }   
  15.        
  16. }  

这种结构把一个继承树全部移植到一张表内,通过一个字段来标识。相对而言,任何填加,修改,删除的操作都针对于一张表而言,在速度上有一定的优势,但是由于通过一个字段来体现多态,结构局限性比较大。而且维护的成本也比较高!违反了OO的高内聚,低偶合的原则。

java 代码
  1. From Right  

查询出来的结果是表tb_right的全部内容!

java 代码
  1. From Lease  

查询出来的结果是表tb_right中字段right_type为Lease_sub的所有字段!

java 代码
  1. From Property  

查询出来的结果是表tb_right中字段right_type为Property_sub的所有字段!

 策略3:字段共享策略

java 代码
  1. @Entity  
  2. @Inheritance(strategy=InheritanceType.JOINED)   
  3. @Table(name="tb_estate")   
  4. public class Estate implements Serializable{   
  5.   
  6.     Integer id;   
  7.     String description;   
  8.        
  9.     @Column(name="description")   
  10.     public String getDescription() {   
  11.         return description;   
  12.     }   
  13.     public void setDescription(String description) {   
  14.         this.description = description;   
  15.     }   
  16.     @Id  
  17.     @GeneratedValue  
  18.     @Column(name="id")   
  19.     public Integer getId() {   
  20.         return id;   
  21.     }   
  22.     public void setId(Integer id) {   
  23.         this.id = id;   
  24.     }      
  25. }  
java 代码
  1. @Entity  
  2. @Table(name="tb_build")   
  3. @PrimaryKeyJoinColumn(name="id")   
  4. public class Building extends Estate {   
  5.        
  6.     String address;   
  7.        
  8.     @Column(name="address")   
  9.     public String getAddress() {   
  10.         return address;   
  11.     }   
  12.     public void setAddress(String address) {   
  13.         this.address = address;   
  14.     }   
  15. }  
java 代码
  1. @Entity  
  2. @Table(name="tb_land")   
  3. @PrimaryKeyJoinColumn(name="id")   
  4. public class Land extends Estate {   
  5.   
  6.     String landName;   
  7.        
  8.     @Column(name="land_name")   
  9.     public String getLandName() {   
  10.         return landName;   
  11.     }   
  12.     public void setLandName(String landName) {   
  13.         this.landName = landName;   
  14.     }   
  15. }  

 

分享到:
评论
1 楼 liuxinsudi 2008-03-19  
感谢!!!!

相关推荐

    java持久层框架对比

    Java持久层框架是用于实现对象与数据库之间的交互,以便在软件开发过程中简化数据库操作的重要工具。本文旨在对比四种常用的Java持久层框架:Hibernate、iBatis(现称MyBatis)、EJB(Entity Bean)以及JDO(Java ...

    java程序员面试(这几天面试题)

    11. **SSH(Spring、Struts、Hibernate)**:SSH是Java Web开发的三大框架组合,Spring负责依赖注入和事务管理,Struts处理请求和视图,Hibernate则作为持久层框架,简化数据库操作。 12. **EJB(Enterprise ...

    深入浅出面向对象的分析与设计1

    4. **数据库设计**:如果系统需要持久化存储数据,则需要设计相应的数据库模型。 #### 四、面向对象编程语言的特点 1. **支持封装**:大多数现代OO语言都支持封装特性,如Java、C++等。 2. **支持继承**:OO语言...

    如何学好JAVA编程[文].pdf

    在掌握了J2SE的基础后,进一步学习《Thinking in Enterprise Java》,了解J2EE(现在的Java EE)基础知识,如持久层机制。实践中,尝试使用jsp + servlet + javabean实现三层架构,区分表现层、业务层和数据访问层。...

    java论坛源码(适用于java初学者)

    OO编程包括封装、继承和多态三个主要特性。在这个论坛系统中,你可以看到如何通过类和对象来表示用户、帖子、评论等实体,以及它们之间的关系。通过分析源码,初学者能加深对这些概念的理解,并学习如何在实际项目中...

    写给大家看的面向对象编程书(第3版).[美]Matt Weisfeld(带详细书签).pdf

    1.1 过程式程序设计与OO程序设计 2 1.2 从过程式开发转向面向对象开发 4 1.2.1 过程式程序设计 5 1.2.2 OO程序设计 5 1.3 对象到底是什么 5 1.3.1 对象数据 5 1.3.2 对象行为 6 1.4 类到底是什么 9 1.4.1 ...

    UML和模式应用(架构师必备).part01.rar

    17.4 GRASP:基本OO设计的系统方法 17.5 职责、GRASP和UML图之间的联系 17.6 什么是模式 17.7 现在我们所处的位置 17.8 使用GRASP进行对象设计的简短示例 17.9 在对象设计中应用GRASP 17.10 创建者 17.11 ...

    UML和模式应用(架构师必备).part07.rar

    17.4 GRASP:基本OO设计的系统方法 17.5 职责、GRASP和UML图之间的联系 17.6 什么是模式 17.7 现在我们所处的位置 17.8 使用GRASP进行对象设计的简短示例 17.9 在对象设计中应用GRASP 17.10 创建者 17.11 ...

    UML和模式应用(架构师必备).part02.rar

    17.4 GRASP:基本OO设计的系统方法 17.5 职责、GRASP和UML图之间的联系 17.6 什么是模式 17.7 现在我们所处的位置 17.8 使用GRASP进行对象设计的简短示例 17.9 在对象设计中应用GRASP 17.10 创建者 17.11 ...

    UML和模式应用(架构师必备).part06.rar

    17.4 GRASP:基本OO设计的系统方法 17.5 职责、GRASP和UML图之间的联系 17.6 什么是模式 17.7 现在我们所处的位置 17.8 使用GRASP进行对象设计的简短示例 17.9 在对象设计中应用GRASP 17.10 创建者 17.11 ...

    UML和模式应用(架构师必备).part03.rar

    17.4 GRASP:基本OO设计的系统方法 17.5 职责、GRASP和UML图之间的联系 17.6 什么是模式 17.7 现在我们所处的位置 17.8 使用GRASP进行对象设计的简短示例 17.9 在对象设计中应用GRASP 17.10 创建者 17.11 ...

    UML和模式应用(架构师必备).part04.rar

    17.4 GRASP:基本OO设计的系统方法 17.5 职责、GRASP和UML图之间的联系 17.6 什么是模式 17.7 现在我们所处的位置 17.8 使用GRASP进行对象设计的简短示例 17.9 在对象设计中应用GRASP 17.10 创建者 17.11 ...

    UML和模式应用(架构师必备).part08.rar

    17.4 GRASP:基本OO设计的系统方法 17.5 职责、GRASP和UML图之间的联系 17.6 什么是模式 17.7 现在我们所处的位置 17.8 使用GRASP进行对象设计的简短示例 17.9 在对象设计中应用GRASP 17.10 创建者 17.11 ...

    UML和模式应用(架构师必备).part05.rar

    17.4 GRASP:基本OO设计的系统方法 17.5 职责、GRASP和UML图之间的联系 17.6 什么是模式 17.7 现在我们所处的位置 17.8 使用GRASP进行对象设计的简短示例 17.9 在对象设计中应用GRASP 17.10 创建者 17.11 ...

    Java Web开发学习路线图(JBoss Seam方向)

    #### 六、数据持久层技术 1. **SQL与性能优化**:提升SQL技能,学习SQL查询优化技巧。 2. **JDBC**:掌握使用JDBC进行数据库操作的方法。 3. **Hibernate与ORM**:理解Hibernate的使用,深入学习ORM(对象关系...

    Java+英语词汇表.doc

    在 Java 中,数据源通常是指数据库或其他持久化存储。 #### Data Management System (DBMS) **概念解析:** DBMS(数据库管理系统)是一种软件系统,用于管理数据库中的数据。它提供了创建、维护和访问数据的方式。...

    javaEE学习笔记

    - 类的设计原则,如封装、继承、多态。 - 对象的创建和使用。 - **高级语言特性** - 泛型的使用。 - 枚举类型的特点。 - 注解的应用场景。 - **异常** - 异常处理机制。 - 自定义异常类的实现。 - 如何...

Global site tag (gtag.js) - Google Analytics