WADER

java,swt,hibernate,struts,xml,spring,ant,cvs,uml,db,server
随笔 - 15, 文章 - 0, 评论 - 0, 引用 - 0
数据加载中……

概要设计怎么写(你想成为软件设计师吗) (转贴)( 2005-08-10 11:41)

发表者付:
做软件到一定层次了,就要考虑到设计了,设计了很久,就是不系统,系统的设计需要一个记录,记录就用文档,那么对项目所有包括技术上的设计都记录下来,我们就可以理解为软件的概要设计了。


在需求明确、准备开始编码之前,要做概要设计,而详细设计可能大部分公司没有做,有做的也大部分是和编码同步进行,或者在编码之后。因此,对大部分的公司来说,概要设计文档是唯一的设计文档,对后面的开发、测试、实施、维护工作起到关键性的影响。
  一、问题的提出
  概要设计写什么?概要设计怎么做?
  如何判断设计的模块是完整的?
  为什么说设计阶段过于重视业务流程是个误区?
  以需求分析文档还是以概要设计文档来评估开发工作量、指导开发计划准确?
  结构化好还是面向对象好?
  以上问题的答案请在文章中找。
  二、概要设计的目的
  将软件系统需求转换为未来系统的设计;
  逐步开发强壮的系统构架;
  使设计适合于实施环境,为提高性能而进行设计;
  结构应该被分解为模块和库。
  三、概要设计的任务
   制定规范:代码体系、接口规约、命名规则。这是项目小组今后共同作战的基础,有了开发规范和程序模块之间和项目成员彼此之间的接口规则、方式方法,大家就有了共同的工作语言、共同的工作平台,使整个软件开发工作可以协调有序地进行。
  总体结构设计:
  功能(加工)->模块:每个功能用那些模块实现,保证每个功能都有相应的模块来实现;
  模块层次结构:某个角度的软件框架视图;
  模块间的调用关系:模块间的接口的总体描述;
  模块间的接口:传递的信息及其结构;
  处理方式设计:满足功能和性能的算法
  用户界面设计;
  数据结构设计:
  详细的数据结构:表、索引、文件;
  算法相关逻辑数据结构及其操作;
  上述操作的程序模块说明(在前台?在后台?用视图?用过程?······)
  接口控制表的数据结构和使用规则
  其他性能设计。
  四、概要设计写什么
  结构化软件设计说明书结构(因篇幅有限和过时嫌疑,在此不作过多解释)
  任务:目标、环境、需求、局限;
  总体设计:处理流程、总体结构与模块、功能与模块的关系;
  接口设计:总体说明外部用户、软、硬件接口;内部模块间接口(注:接口≈系统界面)
  数据结构:逻辑结构、物理结构,与程序结构的关系;
  模块设计:每个模块“做什么”、简要说明“怎么做”(输入、输出、处理逻辑、与其它模块的接口,与其它系统或硬件的接口),处在什么逻辑位置、物理位置;
  运行设计:运行模块组合、控制、时间;
  出错设计:出错信息、处错处理;
  其他设计:保密、维护;
  OO软件设计说明书结构
  1 概述
  系统简述、软件设计目标、参考资料、修订版本记录
  这部分论述整个系统的设计目标,明确地说明哪些功能是系统决定实现而哪些时不准备实现的。同时,对于非功能性的需求例如性能、可用性等,亦需提及。需求规格说明书对于这部分的内容来说是很重要的参考,看看其中明确了的功能性以及非功能性的需求。
这部分必须说清楚设计的全貌如何,务必使读者看后知道将实现的系统有什么特点和功能。在随后的文档部分,将解释设计是怎么来实现这些的。
  2 术语表
  对本文档中所使用的各种术语进行说明。如果一些术语在需求规格说明书中已经说明过了,此处不用再重复,可以指引读者参考需求说明。
  3 用例
  此处要求系统用用例图表述(UML),对每个用例(正常处理的情况)要有中文叙述。
  4 设计概述
  4.1 简述
  这部分要求突出整个设计所采用的方法(是面向对象设计还是结构化设计)、系统的体系结构(例如客户/服务器结构)以及使用到的相应技术和工具(例如OMT、Rose)
  4.2 系统结构设计
  这部分要求提供高层系统结构(顶层系统结构、各子系统结构)的描述,使用方框图来显示主要的组件及组件间的交互。最好是把逻辑结构同物理结构分离,对前者进行描述。别忘了说明图中用到的俗语和符号。
  4.3 系统界面
  各种提供给用户的界面以及外部系统在此处要予以说明。如果在需求规格说明书中已经对用户界面有了叙述,此处不用再重复,可以指引读者参考需求说明。如果系统提供了对其它系统的接口,比如说从其它软件系统导入/导出数据,必须在此说明。
  4.4 约束和假定
  描述系统设计中最主要的约束,这些是由客户强制要求并在需求说明书写明的。说明系统是如何来适应这些约束的。
  另外如果本系统跟其它外部系统交互或者依赖其它外部系统提供一些功能辅助,那么系统可能还受到其它的约束。这种情况下,要求清楚地描述与本系统有交互的软件类型以及这样导致的约束。
  实现的语言和平台也会对系统有约束,同样在此予以说明。
  对于因选择具体的设计实现而导致对系统的约束,简要地描述你的想法思路,经过怎么样的权衡,为什么要采取这样的设计等等。
  5 对象模型
  提供整个系统的对象模型,如果模型过大,按照可行的标准把它划分成小块,例如可以把客户端和服务器端的对象模型分开成两个图表述。在其中应该包含所有的系统对象。这些对象都是从理解需求后得到的。要明确哪些应该、哪些不应该被放进图中。所有对象之间的关联必须被确定并且必须指明联系的基数。聚合和继承关系必须清楚地确定下来。每个图必须附有简单的说明。
  6 对象描述
  在这个部分叙述每个对象的细节,它的属性、它的方法。在这之前必须从逻辑上对对象进行组织。你可能需要用结构图把对象按子系统划分好。
  为每个对象做一个条目。在系统对象模型中简要的描述它的用途、约束(如只能有一个实例),列出它的属性和方法。如果对象是存储在持久的数据容器中,标明它是持久对象,否则说明它是个临时对象(transient object)。
  对每个对象的每个属性详细说明:名字、类型,如果属性不是很直观或者有约束(例如,每个对象的该属性必须有一个唯一的值或者值域是有限正整数等)。
  对每个对象的每个方法详细说明:方法名,返回类型,返回值,参数,用途以及使用的算法的简要说明(如果不是特别简单的话)。如果对变量或者返回值由什么假定的话,Pre-conditions和Post-conditions必须在此说明。列出它或者被它调用的方法需要访问或者修改的属性。最后,提供可以验证实现方法的测试案例。
  7 动态模型
  这部分的作用是描述系统如何响应各种事件。一般使用顺序图和状态图。
  确定不同的场景(Scenario)是第一步,不需要确定所有可能的场景,但是必须至少要覆盖典型的系统用例。不要自己去想当然地创造场景,通常的策略是描述那些客户可以感受得到的场景。
  7.1 场景(Scenarios)
  对每个场景做一则条目,包括以下内容:
  场景名:给它一个可以望文生义的名字
  场景描述:简要叙述场景是干什么的以及发生的动作的顺序。
  顺序图:描述各种事件及事件发生的相对时间顺序。
  7.2 状态图
  这部分的内容包括系统动态模型重要的部分的状态图。可能你想为每个对象画一个状态图,但事实上会导致太多不期望的细节信息,只需要确定系统中一些重要的对象并为之提供状态图即可。
  8 非功能性需求
  五、概要设计怎么做
  结构化软件设计方法:
  详细阅读需求规格说明书,理解系统建设目标、业务现状、现有系统、客户需求的各功能说明;
  分析数据流图,弄清数据流加工的过程;
  根据数据流图决定数据处理问题的类型(变换型、事务型、其他型);
  通过以上分析,推导出系统的初始结构图;
  对初始结构图进行改进完善:所有的加工都要能对应到相应模块(模块的完整性在于他们完成了需求中的所有加工),消除完全相似或局部相似的重复功能(智者察同),理清模块间的层次、控制关系,减少高扇出结构,随着深度增大扇入,平衡模块大小。
  由对数据字典的修改补充完善,导出逻辑数据结构,导出每种数据结构上的操作,这些操作应当属于某个模块。
  确定系统包含哪些应用服务系统、客户端、数据库管理系统;
  确定每个模块放在哪个应用服务器或客户端的哪个目录、哪个文件(库),或是在数据库内部建立的对象。
  对每个筛选后的模块进行列表说明。
  对逻辑数据结构进行列表说明。
  根据结构化软件设计说明书结构对其他需要说明的问题进行补充说明,形成概要设计说明书。
  OO软件设计方法:
  在OOA基础上设计对象与类:在问题领域分析(业务建模和需求分析)之后,开始建立系统构架。
  第一步是抽取建立领域的概念模型,在UML中表现为建立对象类图、活动图和交互图。对象类就是从对象中经过“察同”找出某组对象之间的共同特征而形成类:
  对象与类的属性:数据结构;
  对象与类的服务操作:操作的实现算法;
  对象与类的各外部联系的实现结构;
  设计策略:充分利用现有的类;
  方法:继承、复用、演化;
  活动图用于定义工作流,主要说明工作流的5W(Do What、Who Do、When Do、Where Do、Why Do)等问题,交互图把人员和业务联系在一起是为了理解交互过程,发现业务工作流中相互交互的各种角色。
  第二步是构建完善系统结构:对系统进行分解,将大系统分解为若干子系统,子系统分解为若干软件组件,并说明子系统之间的静态和动态接口,每个子系统可以由用例模型、分析模型、设计模型、测试模型表示。软件系统结构的两种方式:层次、块状
  层次结构:系统、子系统、模块、组件(同一层之间具有独立性);
  块状结构:相互之间弱耦合
  系统的组成部分:
  问题论域:业务相关类和对象(OOA的重点);
  人机界面:窗口、菜单、按钮、命令等等;
  数据管理:数据管理方法、逻辑物理结构、操作对象类;
  任务管理:任务协调和管理进程;
  第三步是利用“4+1”视图描述系统架构:用例视图及剧本;说明体系结构的设计视图;以模块形式组成包和层包含概要实现模型的实现视图;说明进程与线程及其架构、分配和相互交互关系的过程视图;说明系统在操作平台上的物理节点和其上的任务分配的配置视图。在RUP中还有可选的数据视图。
  第四步是性能优化(速度、资源、内存)、模型清晰化、简单化(简单就是享受)。
  六、概要设计的原则
  总体原则和方法:由粗到细的原则,互相结合的原则,定性分析和定量分析相结合的方法,分解和协调的方法和模型化方法。
  要系统考虑系统的一般性、关联性、整体性和层次性。
  分解协调:目的是为了创造更好的系统。系统分解是指将一个复杂的系统分解为若干个子系统,系统协调一是系统内协调,即根据系统的总结构、总功能、总任务和总目标的要求,使各个子系统之间互相协调配合,在各个子系统局部优化基础上,通过内部平衡的协调控制,实现系统的整体优化;
  屏蔽抽象:从简单的框架开始,隐含细节;
  一致性:统一的规范、统一的标准、统一的文件模式;
  每个模块应当有一个统一命名的容易理解的名字;
  编码:由外向内(界面->核心);
  面向用户:概要设计是对于按钮按下后系统“怎么做”的简要说明;
  模块、组件的充分独立性、封闭性;
  同时考虑静态结构与动态运行;
  每个逻辑对象都应当说明其所处物理对象(非一一对应);
  每个物理对象都有合适的开发人员,并且利于分工与组装。(详细说明见本人另一篇文章:系统构架设计应考虑的因素);
  确立每个构架视图的整体结构:视图的详细组织结构、元素的分组以及这些主要分组之间的接口;
  软件构架与使用的技术平台密切相关,目前常用的平台有J2EE、.NET、CORBA等等,因此具体的软件构架人员应当具备使用这些平台的软件开发经验;
  通过需求功能与设计模块之间的列表对应,检查每个需求功能是否都有相应的模块来实现,保证需求功能的可追溯性和需求实现(模块)的完整性,同时可以检查重复和不必要的模块。
  在需求调研分析过程中对业务处理过程了解的完整性和准确性非常重要。调查了解清楚所有的业务流程才能设计出适合各流程业务节点用户业务特点和习惯的软件,使开发出来的软件更受欢迎。当然在进行软件概要设计时,要尽量排除业务流程的制约,即把流程中的各项业务结点工作作为独立的对象,设计成独立的模块,充分考虑他们与其他各种业务对象模块的接口,在流程之间通过业务对象模块的相互调用实现各种业务,这样,在业务流程发生有限的变化时(每个业务模块本身的业务逻辑没有变的情况下),就能够比较方便地修改系统程序模块间的调用关系而实现新的需求。如果这种调用关系被设计成存储在配置库的数据字典里,则连程序代码都不用修改,只需修改数据字典里的模块调用规则即可。
  七、概要设计的重要输出
  编码规范:信息形式、接口规约、命名规则;
  物理模型:组件图、配置图;
  不同角度的构架视图:用例视图、逻辑视图、进程视图、部署视图、实施视图、数据视图(可选);
  系统总体布局:哪些部分组成、各部分在物理上、逻辑上的相互关系;
  两个不可忽视的输出:
  与需求功能的关系:对于需求中的每一个功能,用哪一层、哪个模块、哪个类、哪个对象来实现(一对多关系);反过来,应当说明将要创建的系统每一层、每个模块、每个对象、每一个类“做什么”,他们是为了帮助实现哪些功能(一对多关系)。(需求的颗粒度在一开始往往是比较粗的,因此根据功能点对于整体项目规模的估计或得到项目WBS其误差范围也是比较大的。更为重要的原因是,需求往往不是编码工作分解的准确依据,因为一个需求的功能点可能对应多个代码模块,而多个需求的功能点也可能只对应一个或少数代码模块,同时还有软件复用等因素要考虑,因此只有在概要设计完成以后才能准确地得到详细设计或编码阶段的二次WBS,并估计较为准确的整体项目规模。)
  逻辑与物理位置:每个对象在逻辑上分别落在哪一层、哪个模块、哪个类;在物理上每个模块、每个对象、每一个类放在哪个应用服务器或客户端的哪个目录、哪个文件(库),或者是建立在数据库管理系统中的什么东东(过程、函数、视图、触发器等等)。
  八、结构化与面向对象方法特点比较
  1. 从概念方面看,结构化软件是功能的集合,通过模块以及模块和模块之间的分层调用关系实现;面向对象软件是事物的集合,通过对象以及对象和对象之间的通讯联系实现;
  2. 从构成方面看,结构化软件=过程+数据,以过程为中心;面向对象软件=(数据+相应操作)的封装,以数据为中心;
  3. 从运行控制方面看,结构化软件采用顺序处理方式,由过程驱动控制;面向对象软件采用交互式、并行处理方式,由消息驱动控制;
  4. 从开发方面看,结构化方法的工作重点是设计;面向对象方法的工作重点是分析;但是,在结构化方法中,分析阶段和设计阶段采用了不相吻合的表达方式,需要把在分析阶段采用的具有网络特征的数据流图转换为设计阶段采用的具有分层特征的结构图,在面向对象方法中则不存在这一问题。
  5. 从应用方面看,相对而言,结构化方法更加适合数据类型比较简单的数值计算和数据统计管理软件的开发;面向对象方法更加适合大型复杂的人机交互式软件和数据统计管理软件的开发;
  参考文献:
  《实用软件工程》第二版,郑人杰、殷人昆、陶永雷等著
  《微软项目:求生法则》Steve McConnell著,余孟学译
  《软件工程:实践者的研究方法》(第5版)Roger S.Pressman著
  《软件构架实践》SEI软件工程译丛,林·巴斯著
  《RUP2000》电子版;
  《UML与系统分析设计》张龙祥著;
  《面向对象的分析与设计》杨正甫著;

posted @ 2005-11-23 16:03 wader 阅读(1316) | 评论 (1)编辑 收藏

Oracle开发人员 JAVA存储过程(转贴)(2005-07-12 17:51 )

Oracle开发人员 JAVA存储过程
利用Java存储过程简化数据库操作
作者:Kuassi Mensah
利用Java存储过程沟通SQL、XML、Java、J2EE和Web服务。
存储过程(stored procedure)允许将运行于数据库层中的持久性逻辑与运行于中间层中的商务逻辑有效地分离开来。这种分离可以降低整个应用程序的复杂性,并提供其重用性、安全性、性能和可伸缩性。

但是,妨碍存储过程广泛采用的一个主要障碍是不同数据库厂商使用各种专有的、且依赖于数据库的实现语言。使用基于Java的存储过程可以解决这一问题。Oracle已经实现了ANSI标准,这些标准规定了从SQL中将静态Java方法作为过程或函数进行调用的能力。这种实现被简单地称作"Java存储过程"。

在本文中,你将了解基于Java的存储过程如何帮助简化商务逻辑、提高其性能,并扩展数据库的功能。本文将介绍Oracle如何在数据库内启用基于Java的存储过程。还会介绍Java存储过程如何访问数据,以及如何创建基本Java存储过程。

选择PL/SQL还是Java

在考虑Oracle存储过程时,你可能会想到PL/SQL。不过,从Oracle8i开始,Oracle已经在数据库中支持Java,从而为存储过程提供了不同于PL/SQL的开放式和可移植的方法。我可以听到"$64 000问题":"我如何在PL/SQL和Java之间做出选择?我是否应当忘记已经学习的所有PL/SQL相关知识,而变为一个Java天地的新手?"

两种语言都适用于数据库编程,都有自己的优点和弱点。在决定选择哪一种语言时,可以参考下面根据经验得出的通用规则:

对于要求与SQL进行无缝集成的数据库中心来说则逻辑使用PL/SQL,从而完成对数据库对象、类型和特性的访问。
出于与数据库的无关性考虑时,可以选择Java作为开放式的语言来取代PL/SQL,同时也为了集成和沟通SQL、XML、J2EE和Web服务等各个领域。
OralceJVM使得Java可以运行在数据库中

从Oracle8i版本1(Oralce8.1.5)开始,Oracle便提供紧密集成的Java虚拟机(JVM),JVM支持Oralce的数据库会话期结构。任何数据库对话期都可以在第一Java代码调用时启动一个虚拟上专用的JVM,后续的用户可以使用这一已经存在的支持Java的会话期。事实上,所有会话共享同一JVM代码并保持"仅静态"的私有状态,而垃圾则收集在单个对话期空间内,从而为各个Java对话期提供了和SQL操作相同的对话期隔离和数据完整性能力。这里,不需要为了数据完整性而进行单独的Java支持的过程。这一基于对话期的结构提供了较小的内存占用率,并使OracleJVM具有与Oracle数据库一样的线性SMP可伸缩性。

创建Java存储过程

要将Java方法转换为Java存储过程需要几个步骤,包括:用loadjava实用程序将Java类加载到数据库中,利用调用规范(Call Spec)发布Java方法,将Java方法、参数类型和返回类型映射到其SQL的对应部分。下面部分说明如何完成这些步骤。

我将使用一个简单的Hello类,它有一个方法Hello.world(),返回字符串"Hello world":
public class Hello { public static String world () { return "Hello world"; } }
Loadjava 实用程序

Loadjava是加载Java源文件、Java类文件和Java资源文件的实用程序,它可以用来验证字节码,并将Java类和JAR文件布置到数据库中。它既可以通过命令行调用,也可以通过包含于DBMS_JAVA类中的loadjava()方法调用。为了加载我们的Hello.class示例,输入:
loadjava -user scott/tiger Hello.class

从Oracle9i版本2开始,loadjava允许通过为包含在被处理的类中的方法创建相应的Call Specs来自动将Java类发布为存储过程。Oracle为开发、测试、调试和布置Java存储过程提供了Oracle9i JDeveloper。

The Resolver Spec

基于JDK的JVM在列于CLASSPATH中的目录中查找类引用,并对其进行解析。因为Oracle数据库类存在于数据库模式中,所以OracleJVM利用数据库解析器(resolver)通过列于Resolver Spec中的模式查找并解析类引用。与CLASSPATH不同(CLASSPATH可以应用于所有的类),Resover Spec根据每类的情况进行应用。缺省解析器首先在加载类的模式中搜寻类,然后在公共同义词(public synonyms)中搜索。 
 loadjava -resolve <myclass>
你可能需要指定不同的解析器,也可以在使用loadjava时强制进行解析,从而在布置时确定可能在以后运行时发生的任何问题。
loadjava -resolve -resolver "((* SCOTT) (foo/bar/* OTHERS) (* PUBLIC))"
Call Spec和存储过程调用

为了从SQL中调用Java方法(以及从PL/SQl和JDBC中调用),必须首先通过Call Spec发布公共静态方法,它为SQL定义方法采用的参数以及返回的SQL类型。

在我们的例子中,我们将利用SQL*Plus连接到数据库,并为Hello.world()定义一个顶级Call Spec:
SQL> connect scott/tiger SQL> create or replace function helloworld return VARCHAR2 as language java name 'Hello.world () return java.lang.String'; / Function created.
可以像下面这样调用Java存储过程:
SQL> variable myString varchar2[20]; SQL> call helloworld() into :myString; Call completed. SQL> print myString; MYSTRING --------------------- Hello world
Java存储过程可以通过其Call Spec从以下各项中进行调用:SQL DML语句(INSERT, UPDATE、DELETE、SELECT、CALL、EXPLAIN PLAN、LOCK TABLE和MERGE)、PL/SQL块、子程序、程序包以及数据库触发器。Call Spec的美妙之处在于存储过程实现可以从PL/SQL转换为Java,反之亦可,这一点对于请求者是透明的。

Call Spec从实现语言中(PL/SQL或Java)中抽象出调用界面,因而使之能够在原有应用程序和新的基于Java/J2EE的应用程序之间共享商务逻辑。但是,在从Java客户程序调用在数据库驻留的Java类时,你可能不希望通过PL/SQL包装器(wrapper)。在以后的版本中,Oracle计划提供一种机制,它可以使开发人员略过Call Spec。

高级数据访问控制

Java存储过程可用于控制和限制对Oracle数据的访问,其方法是只允许用户通过存储过程管理数据,而存储过程在其调用者的权限内执行,而不能对表本身进行访问。例如,你可以在特定时间内禁止更新数据,或者使管理者只具有查询工资数据的权利,而不能进行更新,或者记录所有的访问并通知某一安全机构。

原有应用程序与J2EE应用程序之间的数据逻辑共享因为原有应用程序与J2EE应用程序都通过Call Spec调用存储过程,所以J2EE和非J2EE应用程序可以共享相同的数据逻辑。由于有了Call Spec,所以不用考虑所用的是何种实现语言(无论是PL/SQL还是Java),该数据逻辑都可以共享。

为BMP实体Bean自动生成主关键字

在对EJB实体bean应用BMP时,一个bean实例可以由自动生成的与新插入的数据相关联的主关键字惟一确定,它是ejbCreate()的返回值。可以利用一个插入相应数据的存储过程在一个数据库操作中检索ejbCeater()中的该值,并检索或计算主关键字。作为另一种方法,也可以利用JDBC3.0的RETURN_GENERATED_KEYS特性,以一个SQL语句插入该数据并检索相应的关键字(或ROWID)。但是,存储过程方法在各个JDBC驱动器版本和数据库之间更具可移植性。

posted @ 2005-11-23 15:54 wader 阅读(442) | 评论 (0)编辑 收藏

标准hibernate配置文件(我以前做海信项目时配置的)

<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"
http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>

<!-- properties -->

<property name="hibernate.connection.driver_class">net.sourceforge.jtds.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:jtds:sqlserver://192.168.0.29:1433/HisenseCommunity</property>
<property name="hibernate.connection.username">sa</property>
<property name="hibernate.connection.password">admin</property>
<property name="hibernate.dialect">org.hibernate.dialect.SybaseDialect</property>
<property name="hibernate.connection.pool.size">20</property>
<property name="hibernate.show_sql">true</property>

<!-- mapping files -->
<mapping resource="hisense/ORMFILE/AdminInfoBean.hbm.xml"/>
<mapping resource="hisense/ORMFILE/AdminLevel.hbm.xml"/>
<mapping resource="hisense/ORMFILE/Operate.hbm.xml"/>
<mapping resource="hisense/ORMFILE/Relation.hbm.xml"/>
<mapping resource="hisense/ORMFILE/Community.hbm.xml"/>
<mapping resource="hisense/ORMFILE/Category.hbm.xml"/>
<mapping resource="hisense/ORMFILE/CategoryType.hbm.xml"/>
<mapping resource="hisense/ORMFILE/AdBusiness.hbm.xml"/>
<mapping resource="hisense/ORMFILE/AdClient.hbm.xml"/>
<mapping resource="hisense/ORMFILE/AdContent.hbm.xml"/>
<mapping resource="hisense/ORMFILE/AdType.hbm.xml"/>
<mapping resource="hisense/ORMFILE/Profile.hbm.xml"/>
<mapping resource="hisense/ORMFILE/ProfileDv.hbm.xml"/>
<mapping resource="hisense/ORMFILE/ProfileAlbum.hbm.xml"/>
<mapping resource="hisense/ORMFILE/Club.hbm.xml"/>
<mapping resource="hisense/ORMFILE/CommendType.hbm.xml"/>
<mapping resource="hisense/ORMFILE/Comment.hbm.xml"/>
<mapping resource="hisense/ORMFILE/Goods.hbm.xml"/>
<mapping resource="hisense/ORMFILE/CommunityMarket.hbm.xml"/>
<mapping resource="hisense/ORMFILE/CommunityMarketType.hbm.xml"/>
<mapping resource="hisense/ORMFILE/News.hbm.xml"/>
<mapping resource="hisense/ORMFILE/Merchant.hbm.xml"/>
<mapping resource="hisense/ORMFILE/Commend.hbm.xml"/>
<mapping resource="hisense/ORMFILE/ClubActivities.hbm.xml"/>
<mapping resource="hisense/ORMFILE/ActivityType.hbm.xml"/>
<mapping resource="hisense/ORMFILE/EstateManagement.hbm.xml"/>
<mapping resource="hisense/ORMFILE/ProfileAndClubRelations.hbm.xml"/>

</session-factory>
</hibernate-configuration>

posted @ 2005-11-23 15:37 wader 阅读(677) | 评论 (0)编辑 收藏

用xdoclet 1.2 实例生成struts实体bean的hbm文件

这是我曾经为系统生成hbm文件时编写的一个ant 的build.xml配置文件,这里面主要有两类参数设置,一类是路径设置,另一类是功能加载设置;下面通过看看我的注释你就应该明白了:
<?xml version="1.0" encoding="UTF-8"?>         //xml标头信息
<project name="Test" default="all" basedir=".">      //basedir是指定根目录,"."提当前目录;
   <property name="classes" location="./classes"/>      //生成类的指定目录
   <property name="src" value="src" />      //源文件,要编译的源的目录;
   <property name="db" value="db" />      //数据库设置
   <property name="lib" value="./aiihome_admin/WEB-INF/lib" />  //指定库路径;
   <property name="lib-xdoc" value="./lib" />            //指定xdoc库路径;
   <property name="build" value="classes" />            //成生输出的目录;

   <path id="myclasspath">         //设置路径组
    <fileset dir="${lib}">
     <include name="*.jar"/>
    </fileset>
    <fileset dir="${lib-xdoc}">
     <include name="*.jar"/>
    </fileset>

   </path>

   <target name="init">                  //设置初始化功能
   <mkdir dir="${classes}"/>
   </target>

   <target name="compile" depends="init">         //设置要完成的工作,depends指他的依赖项,也是必须项
   <javac executable="jikes" classpathref="myclasspath"    srcdir="${src}" destdir="${classes}"/>
   </target>

   <target name="clean">               //设置清除功能
   <delete dir="${classes}"/>            //dir要清除的目录
   </target>

   <target name="xdoc" description="Generates Hibernate class descriptor files.">          //设置xdoc工作功能
     <taskdef name="hibernatedoclet" classpathref="myclasspath"               classname="xdoclet.modules.hibernate.HibernateDocletTask">       //任务名hibernatedoclet,类库classname
     </taskdef>
     <hibernatedoclet destdir="${classes}">                                       //hibernatedoclet任务设置项
      <fileset dir="${src}">                                                                  //源目录
       <include name="**/*.java"/>                                                      //文件名
      </fileset>
     <hibernate version="2.0"/>                                                         //hibernate vs
   </hibernatedoclet>
   </target>

   <target name="all" depends="xdoc" />                                             //执行任务名
   <!-- Other target omited -->
</project>

关于ant编译文件的标签很多,不同的标签可以实现不同的功能,在编译这一块地,ant真是太强了,可惜我只知道皮毛,提供大家一个配置文件参考:在middlegen2里面有一个example里有一个生成ejb项目的build文件,它的生成项目比较全,应该可以满足一般需要了。

posted @ 2005-11-23 15:30 wader 阅读(563) | 评论 (0)编辑 收藏

[Hibernate]使用XDoclet生成hbm.xml

用XDoclet生成hbm.xml就是在.java文件里写入一些元数据,XDoclet会从这些数据以及类本身得到足够的信息来生成目标文件。当然,除了用于hibernate,XDoclet还可以用于web、ejb等等很多用途。

XDoclet要从sourceforge上下载,包含了很多jar包、文档和例子,我觉得文档做得还是不错的,查起来比较方便。要使用XDoclet,一般要通过ant来完成,也就是在ant脚本里加入XDoclet的内容。

由于eclipse已经包含了ant支持,因此我没有专门去下载一个ant回来,而是直接使用eclipse带的,版本是1.5.3。

创建一个名为build.xml的脚本(其实应该换个名,比如gen-hbm.xml,看起来比较明白),内容如下:

<?xml version="1.0" encoding="ISO-8859-1"?>

<project name="XDoclet Examples" default="hibernate" basedir=".">
    <property name="xdoclet.root.dir" value="c:/xdoclet-1.2.1"/>
    <property name="xdoclet.lib.dir" value="${xdoclet.root.dir}/lib"/>
    <path id="myclasspath">
        <fileset dir="${xdoclet.lib.dir}">
            <include name="*.jar"/>
        </fileset>
    </path>
     <taskdef
        name="hibernatedoclet"
        classname="xdoclet.modules.hibernate.HibernateDocletTask"
        classpathref="myclasspath"
        />
    <target name="hibernate" description="Generate mapping documents">

        <echo>+---------------------------------------------------+</echo>
        <echo>|                                                   |</echo>
        <echo>| R U N N I N G   H I B E R N A T E D O C L E T     |</echo>
        <echo>|                                                   |</echo>
        <echo>+---------------------------------------------------+</echo>

        <hibernatedoclet
            destdir="./src"
            excludedtags="@version,@author,@todo,@see"
            addedtags="@xdoclet-generated at ${TODAY},@copyright The XDoclet Team,@author XDoclet,@version ${version}"
            force="false"
            verbose="true">

            <fileset dir="./src">
                <include name="org/haree/struts/form/UserForm.java"/>
            </fileset>

            <hibernate version="2.0"/>

        </hibernatedoclet>
    </target>
</project>

我曾经卡住的一个地方就是在taskdef里的classpathref属性。一开始我在eclipse的ant运行参数里设置了XDoclet相关的包,总是提示:

Can't create a hibernate element under hibernatedoclet. Make sure the jar file containing the corresponding subtask class is on the classpath specified in the <taskdef> that defined {2}.

后来如上设置了classpathref,即包含了XDoclet使用到的包,并将eclipse的ant里关于XDoclet的包都去掉,竟然就成功了。其实现在也不明白为什么会这样。。。

posted @ 2005-11-23 15:09 wader 阅读(760) | 评论 (0)编辑 收藏

仅列出标题
共2页: 上一页 1 2