这次我们来说一下hibernate的层次设计,层次设计也就是实体之间的继承关系的设计。
也许这样比较抽象,我们直接看例子。
1)我们先看一下普通的做法
直接上代码:三个实类如下:
public class TItem implements Serializable{
//省略Get/Set方法
private int id;
private String manufacture;
private String name;
}
public class TBook extends TItem{
//省略Get/Set方法
private int pageCount;
}
public class TDVD extends TItem{
//省略Get/Set方法
private String regionCode;
}
这里我们需要三个映射文件,内容如下:
<class name="TItem" table="ITEM">
<id name="id" column="id" type="java.lang.Integer">
<generator class="native" />
</id>
<property name="name" column="name" type="java.lang.String"/>
<property name="manufacture" column="manufacture" type="java.lang.String"/>
</class>
<class name="TBook" table="Book">
<id name="id" column="id" type="java.lang.Integer">
<generator class="native" />
</id>
<property name="name" column="name" type="java.lang.String"/>
<property name="manufacture" column="manufacture" type="java.lang.String"/>
<property name="pageCount" column="pageCount" type="java.lang.Integer"/>
</class>
<class name="TDVD" table="DVD">
<id name="id" column="id" type="java.lang.Integer">
<generator class="native" />
</id>
<property name="name" column="name" type="java.lang.String"/>
<property name="manufacture" column="manufacture" type="java.lang.String"/>
<property name="regionCode" column="regionCode" type="java.lang.String"/>
</class>
很普通的映射文件,跟以前的没什么区别。
下面我们直接写一个测试方法:
public void testSelect() {
Query query = session.createQuery("from TItem ");
List list = query.list();
Iterator iter = list.iterator();
while(iter.hasNext()) {
System.out.println("Name:"+(((TItem)iter.next()).getName()));
}
}
注意,这里我们是用TItem类,而不是具体的字类,这里它会自动去查找继承于TItem类的子类,查出所有结果。这里涉及到一个多态模式,class标签有属性 polymorphism,它的默认值为implicit,这意味着不需要指定名称就可以查询出结果。如果为explicit则表明需要指定具体的类名时,才可以查出此类的结果。
2)上个例子中我们用到了三个映射文件,当我们需要修改时,就需要修改三个映射文件,这对于大的项目是很不可行的。而且每个表都有对应的主类的对应字段,这是多余的。所以我们有下面这种方法。
实体类还是跟1)中的一样。我们把映射文件由三个改为一个,只保留TItem映射文件。但我们需要做相应的修改,现在内容如下:
<class name="TItem" table="ITEM" polymorphism="explicit">
<id name="id" column="id" type="java.lang.Integer">
<generator class="native" />
</id>
<property name="name" column="name" type="java.lang.String"/>
<property name="manufacture" column="manufacture" type="java.lang.String"/>
<joined-subclass name="TBook" table="TBOOK">
<key column="id" />
<property name="pageCount" column="pageCount" type="java.lang.Integer" />
</joined-subclass>
<joined-subclass name="TDVD" table="TDVD">
<key column="id"/>
<property name="regionCode" column="regionCode" type="java.lang.String"/>
</joined-subclass>
</class>
这里,我们只有一个映射文件,但有一个joined-subclass标签,它表明这个类继承于当前类,<key>表明分表的主键,这里分表是指TBOOK和TDVD这两个由子类对应的表。分表中只有字段在property中指定。
这样当我们运行后生成的表就如下图:
两个子类对应的表只有我们通过property指定的字段。这样就避免了表内有多个字段,使字表只维护其单独字段,当item类进行改变时,也不用过多的进行修改。
- 大小: 5.5 KB
分享到:
相关推荐
NULL 博文链接:https://javakeith.iteye.com/blog/855338
《Struts Hibernate Spring集成开发宝典》选取的实例繁简适中,与实际开发工作紧密结合,内容讲解由浅入深、循序渐进,可以满足不同层次读者的需求。 作者简介 陈天河,具有多年的软件开发经验,从事基于Java的Web...
hibernate table per subclass 例子代码 实体层次设计
Struts的MVC设计模式可以使我们的逻辑变得很清晰,让我们写的程序层次分明。Spring 提供了管理业务对象的一致方法,并鼓励注入对接口编程而不是对类编程的良好习惯,使我们的产品在最大程度上解耦。Hibernate 是用来...
5.1.3 每个类层次结构一张表 5.1.4 每个子类一张表 5.1.5 混合继承策略 5.1.6 选择策略 5.2 Hibernate类型系统 5.2.1 概述实体和值类型 5.2.2 内建的映射类型 5.2.3 使用映射类型 ...
后台层次非常清晰。 数据库采用MySql。 服务器用tomcat。 设计为原创。 10分不多吧! 因为文件过大,分为两个 一个是源代码 一个是论文 调试出现错误: 1.点击一个网页,进不去,出错误!编码问题,导致中文字符写...
• Single Table per Class Hierarchy Strategy: the <subclass> element in Hibernate 每个类层次结构一张表 • Joined Subclass Strategy: the <joined-subclass> element in Hibernate 连接的子类策略 @...
用java 来建立一个很有价值的web 应用不是一个简单的任务。...何设计来进行松散耦合并能进行灵活变更?应用架构是否允许某一层变更而不影响到其它的层次? 应用应该如何处理容器一级的服务比如事务?
三层结构即Model层、View层和Service层的分离,层次分明的设计结构让整个系统显得层次分明,在实现和后期维护等方面将带来极大的方便。 总体来说,对于土地档案管理系统主要是实现用户管理方面即用户的登录和注册...
2.2.2 Hibernate框架技术 4 2.3 开发工具介绍 5 2.3.1 MyEclipse介绍 5 2.3.2 MySQL5.0介绍 5 3 需求分析 6 3.1 可行性分析 6 3.2 功能需求 6 3.3 性能需求 7 3.4 数据需求 7 3.5 数据字典 7 4 总体设计 9 4.1 总体...
本系统采用的关键技术是Struts2+Hibernate+Spring整合和AJAX。之所以采用SSH整合是因为在软件工程领域,为了降低模块耦合度,提高模块的可重用性,分层一直是广为采纳的一个方法。其实分层还可以使开发人员专注于某...
摘 要 研究土地档案管理关系即为实现一个土地档案管理系统。土地档案管理系统是将现有...三层结构即Model层、View层和Service层的分离,层次分明的设计结构让整个系统显得层次分明,在实现和后期维护等方面将带来极大
将FileActionForm直接作为业务层的接口入参,相当于将Web层传播到业务层中去,即将业务层绑定在特定的Web层实现技术中,按照分层模型学院派的观点,这是一种反模块化的设计,但在"一般"的业务系统并无需提供多种UI...
j2ee 架构设计 第一部份:介绍实例架构 结合实例讲解Web项目总体结构 分析多层结构优点 具体讲解每个层次的实现技巧 第二部分:介绍组织层次关联利器(Spring) 快速入门 Factory模式 IOC模式 AOP模式 演练Spring的...
系统的总体处理流程如图1- 1所示: 图1-1 系统的总体处理流程 1.4 系统体系结构 用一览表及框图的形式说明本系统的系统元素(各层模块、子程序、公用程序等)的 划分,扼要说明每个系统元素的标识符和功能,分层次地...
采用建模语言进行系统的分析设计,针对档案管理过程中一些业务实施系统设计及需求分析,根据系统和用户的具体要求,通过C/S及B/S 2种结构方式,采用多层次的软件功能架构,利用XML语言配置、DAO以及Hibernate等技术,完成...
可能涉及到系统的层次结构划分、模块关系、数据表设计和ER图等。报告还可能介绍了采用的设计模式和技术方案,以及如何保证系统的可扩展性和性能。 在实现部分,报告逐步展示了系统的开发过程。可能包括前端页面的...
常见的Java技术包括Spring框架、Hibernate ORM、Java EE等,根据具体的项目需求来决定使用哪些技术。 实现与编码:在项目实现阶段,根据项目设计和需求分析的结果,进行具体的编码实现。注意编写可读性高、可维护性...