??xml version="1.0" encoding="utf-8" standalone="yes"?> http://developer.51cto.com/developer/51cto-salon-13/ 51CTO开发频道推出《开发月刊》电(sh)子杂志。主要内Ҏ(gu)盖Java?NET、WEB开发、数据库和移动开发等{。从技术细节到目理Q方斚w面ؓ(f)开发者服务?/p> 51CTO开发频道专访J-Hi快速开发^台团队核?j)成员张昊先生,向大家讲qJ-Hi快速开发^C创意到研发再C品的完整脉络和技术领域以?qing)对q大爱好者的一些徏议?/p> 描述Q在DWZ版中lookup的处理机制与l典的完全不同,对于lookup有两U展现Ş式,一U是通过点击lookup图标弹出对话框后带回选中的|另一U是通过在文本框中输入相应信息从而实现联机式的查扑ָ回效果。从实现目的来看Q无非是?/span>lookup的实体的主键值带回到hidden的一个元素中Q而其它值只是作为显C参考之用,与底层的数据库结构与数据库表无关。一个完整的lookup由如?/span>html元素构成Q?/span>1Q一?/span>hidden用于保存带回实体主键?/span>ID|如果要实现缺省的lookupqo(h)或排序可以相应的pageInfo?/span>hidden元素Q具体实现方式的用例参见?/span>HowTo手册》;2Q?/span>n?/span>text用于昄带回的多个数据带回项Q?span style="color: red;">注意Q因为带回的数据与数据讉K层也是数据库表无关Q因此每?/span>text?/span>name都有一?/span>hi_作ؓ(f)前缀Q;3Q一?/span>lookup有且只有一个主带回,只有d回项的文本框是可~辑的ƈ且只有主带回会(x)?/span>lookup图标也就?/span>html的中?/span>a元素?/span> 扩展属性名 ?/span> q?/span> lookupGroup lookupl可以理解ؓ(f)当前实体的名字,如果当前lookuplg是主实体中,?/span>lookupGroup是实体名,如果当前lookuplg在从实体Q也是明细表的lookupQ中Q则lookupGroup是明细的集合属性名 lookupName lookup名可以理解ؓ(f)当前lookup实体的属性名。从整体?/span>DWZ框架来分析,实际上所有的tab都在一?/span>IEH口Q也是?/span>JS文g在打开览器只?x)加载一ơ。这׃生了(jin)必须要保证每一?/span>html元素的唯一性,即是在不同?/span>tab下也是如此。对?/span>lookup来说Q是通过lookupGroup+lookupName来确定元素的唯一性的?/span> suggestClass d回项才会(x)有该属性,实现联想查找带回 ?/span>lookup实体?/span>POJOcȝ全限定名 searchFields 查询qo(h)的属性名列表Q以逗号分隔。例如带?/span>HiUserQ该属性的gؓ(f)”fullName,userNum”Q在文本框中001则^C(x)查询姓名或者是~号?/span>001的所有用?/span> callback 回调Ҏ(gu)名,在查扑ָ回值后pȝ?x)回调该属性的值的Ҏ(gu)Q以实现(zhn)对带回后的Ҏ(gu)处理。例?/span>callback=funQ那么在带回值后pȝ?x)自动调?/span>funҎ(gu)Qƈ?x)自动传入两个参?/span>fun(json,index)Q其?/span>jsonQ是带回的完?/span>json对象Q?/span>indexQ是索引|主要用于明细的带回时要提供是W几条明l记?/span> 场景描述Q一个会(x)员编辑页面要指定该会(x)员所在的省䆾、城?jng)、地区,要求在选择省䆾后会(x)自动qo(h)该省份的城市(jng)Q地Z此类推?/span> 以下所有步骤只是修?/span>OrganizationEdit.jsp文gQ即?/span> 步骤一、ؓ(f)省䆾的主带回加callback回调Ҏ(gu),q在实现?/span>jsҎ(gu) <input type="text" class="textInput" name="organization.hi_province.name" value="${organization.province.name}" callback="processProvince" function processProvince(json){ document.getElementById("pageInfo.province.f_id").value = json.id; } //该方法的目的是在选择某个省䆾后将该省份的ID值放到指定的hidden元素?/span> 步骤?/span>、ؓ(f)城市(jng)加一个用于过滤的hidden元素,注意Q?/span>processProvince()Ҏ(gu)中的赋D句就是该hidden元素;用于qo(h)?/span>name必须?/span>PageInfo的具体类相对应;必须要指?/span>lookupGroup?/span>lookupName <input type="hidden" lookupGroup="organization" lookupName="city" name="pageInfo.province.f_id" id="pageInfo.province.f_id" value=""/> 步骤?/span>、ؓ(f)城市(jng)的主带回加callback回调Ҏ(gu),q在实现?/span>jsҎ(gu) <input type="text" class="textInput" name="organization.hi_city.name" value="${organization.city.name}" callback="processCity" function processCity(json){ document.getElementById("pageInfo.city.f_id").value = json.id; } 步骤?/span>、ؓ(f)地区加一个用于过滤的hidden元素 <input type="hidden" name="pageInfo.city.f_id" id="pageInfo.city.f_id" lookupGroup="organization" lookupName="region" value=""/> ȝQ联下拉实际上?/span>lookup的一个变UŞ式,主要的思想是ؓ(f)你要U联的下拉的lookup加入qo(h),例如在城?jng)加一个省份的qo(h),在选择省䆾时后Q会(x)通过回调Ҏ(gu)这个过滤项的值存到该qo(h)中。这样逐qo(h)实C(jin)U联下拉的效?/span>.
视频Ҏ(gu) 《Java快速开发的分析与探索》[上](张昊Q?/a>
《Java快速开发的分析与探索》[下](张昊Q?br /> 《Java快速开发^C用》(肖金华)(j)
用户交流与问{环?/a>推荐阅读 51CTO?sh)子杂志《开发月刊?/a>
沙龙D与PPT下蝲
51CTO技术沙龙第十三期ȝQJava快速开发之?/a> ?011q??日下?1CTO丑֊的第13?1CTO技术沙龙中Q有q请到Java开源^?#8212;—J-Hi的两位创始h张昊老师和肖金华老师。二位讲师分别从理论和实战来为大家介lJ-HiQ打开Java快速开发之路?a target="_blank" data-mce->查看 PPT下蝲Q《Java快速开发的分析与探索》(张昊Q?/a> 详细分析快速开发与传统开发方式在开发Ş式上的差异,两个模式所存在的风险及(qing)如何规避q些风险Qƈ对开发效率、成本及(qing)开发规范做出对比。最后阐qCؓ(f)什么快速开发将是以后Y件开发的势?PPT下蝲 | 视频下蝲 《Java快速开发^C用》(肖金华)(j) 主要介绍怎样架构你的互联|应用才能显得不是那么草根,Z弱关pȝ论的l构化数据存储与E序设计高性能的数据缓冲层让你的数据离CPU再近一些。如何定位应用的性能瓉以及(qing)p能优化的思\? 视频下蝲 本期讲师介绍
J-Hi快速开发^台团队核?j)成?张昊 软迅博技术发展有限公叔R席架构师Q开源J-Hi快速开发^台团队核?j)成员,q_目的主要发赯(g)与l织者?/td> 软迅博技术发展有限公叔R目ȝ 肖金?/a> 开源J-Hi快速开发^台团队核?j)成员,十一qY件开发经验,带领完成q多个大型项目。熟(zhn)保险及(qing)?sh)力行业Q曾LIT公司保险业务U架构师?/td> 相关Java专题
沙龙现场照片
]]>
]]>
]]>
对于数据库表的关pd体可分ؓ(f)Q如下几UŞ?/span>
many-to-one:相当于一个数据库表的字段Q外键)(j)对应另一张数据库表的主键Q对?/span>J-Hi来说Q就是一?/span>lookupQ查扑ָ回)(j)。即一个实体中的某个属性是lookupcdQ这个属性会(x)lookup另一个实体。对lookup定义的操作步骤请参见“应用开发视?#8221;。页面中的展CŞ式,例如你有一个报销单,?/span>lookup用户Q那么^台就?x)自动将用户的名U带回来Qƈ在数据库中将用户?/span>IDg存到报销单表的相应字D中?/span>
one-to-many:相当于一个数据库表下面会(x)有一个或多个明细表,例如一个报销单是主表而报销单明l是明细表。在数据库端的实现Ş式ؓ(f)Q在明细表中有一个主表的外键ID字段。在J-Hi中我们称之ؓ(f)引用Q具体操作见联机帮助
one-to-one:所谓一对一的关pd数据库上的理解ؓ(f)Q?/span>B表每加一条记?/span>A表也?x)随着增加一条记录,?/span>J-Hi中的表现形式为实体?/span>
对于实体的承,不只是简单的?/span>one-to-one关系Q实体的l承q包括所有的javacȝl承关系Q?/span>JSP面的整合等{?/span>
many-to-many:多对多是一U复杂的表关p,J-Hi是通过中间q渡表来实现q种多对多的关系Q例如一个项目可以有多个成员Q而一个成员又有可能在多个目中,建模的图?/span>
//自定义一个回调函?/span>ajaxDone
<form action="expert_BaseInformationSave.action?navTabId=expert_BaseInformationList&callbackType=closeCurrent&ajax=1"
method="post" class="pageForm required-validate" onsubmit="return validateCallback(this, ajaxDone)">
//回调函数
<script type="text/javascript">
function ajaxDone(json)
{
alert(json.expert.name);
}
</script>
2Q后C码:(x)
public class Expert_BaseInformationSaveAction extends BaseAction implements SynchronizationData{
private Expert_BaseInformation expert_BaseInformation;
private JSONObject json;
public String execute() throws Exception {
Expert_BaseInformationManager expert_BaseInformationMgr = (Expert_BaseInformationManager)
SpringContextHolder.getBean(Expert_BaseInformation.class);
if(super.perExecute(expert_BaseInformation)!= null) return returnCommand();
expert_BaseInformationMgr.saveExpert_BaseInformation(expert_BaseInformation);
super.postExecute(expert_BaseInformation);
json = new JSONObject("expert", expert_BaseInformation, "name, gender, unit");
return "json";
}
public Expert_BaseInformation getExpert_BaseInformation() {
return expert_BaseInformation;
}
public void setExpert_BaseInformation(Expert_BaseInformation expert_BaseInformation) {
this.expert_BaseInformation = expert_BaseInformation;
}
public JSONObject getJson() {
return json;
}
}
注意Q?/span>action中必d?/span>public JSONObject getJson() {
return json;
}Q?/span> 否则前台无法获取json数据?/span>
注:(x)该文档由J-Hi爱好?W笨"提供,他的QQ号ؓ(f)289542213Q欢q大家与他在技术上多多交流
要求在点?yn)L个员工时Q能够查看到该员工所在的部门?/span>
?/span>1-部门?/span>
下图2是所有员工列表:(x)
?/span>-2
当点ȝ五时Q显C王五所在的部门l构?wi)如?/span>3?/span>
?/span>-3
主要代码部分Q?/span>
Q?/span>?/span>Jsp链接代码:(x)
<a
href="tree.action?menuName=orgList&orgId=${item.org.id}" target="dialog">${item.org.orgName}</a>
注意Q?/span>orgId是动态传入的参数Q这里指该员工所在的部门~号?/span>
2、在himenu-config.xml中配|部门树(wi)的后面加上这么一D?/span>
<void property="filter">
<string>org.cis.filter.orgCollectionProcessor</string>
</void>
注意:string标签内的是写qo(h)数据的类?/span>Ҏ(gu)(wi)的数据进行过滤,提供两种接口方式Ҏ(gu)据进行过?/span> MenuFilterProcessor 在获取数据之前填加过滤器;MenuCollectionProcessor 在获取数据之后再Ҏ(gu)据做整理.具体Ҏ(gu)查看java-doc?/span>API?/span>
而例子的orgCollectionProcessorcM码:(x)
public class orgCollectionProcessor implements MenuCollectionProcessor {
public Collection getCollection(Collection coll, Map<String, String> map) {
// TODO Auto-generated method stub
//coll - 当前节点下一U节点的数据集合
//map 动态的传入数据,?/span>map的Ş?/span>
//传入一个员工的所在的部门Id,q回该员工所在的部门l构?/span>
int orgId=Integer.parseInt(map.get("orgId").toString());
for (Iterator iterator = coll.iterator(); iterator.hasNext();) {
Object obj = (Object) iterator.next();
if(obj instanceof HiOrg){
HiOrg hiorg = (HiOrg)obj;
if(hiorg.getId()!=orgId) {
iterator.remove();
coll.remove(obj);
}
}
}
return coll;
}
}
注:(x)该文档由J-Hi爱好?无可"提供,他的QQ号ؓ(f)924372739Q欢q大家与他在技术上多多交流
本文主要介绍通过?wi)Ş菜单选择带回节点值的实现Ҏ(gu)。以选择带回行政区划位置Z?/span>
通过jhi自动生成代码的功能,对于lookup xzqhwz的字D默认是如上带回面Q显然ƈ不能表现行政区划位置之间的主从关pR?/span>
而如果实现如下页面的展示Q将?x)清晰方便许多?/span>
双击卛_带回节点Q也可通过配置带回节点的各U父节点?/span>
下面是配|的Ҏ(gu)Q?/span>
修改C:"Program"hi-studio"eclipse"workspace"earch5"web"WEB-INF"config"himenu-config.xml
在代码末:(x)
</object>
</java>
之前插入Q?/span>(注意修改其中参数)
<void method="put">
<string>zdtree</string>
<object class="org.hi.base.menu.strutsmenu.WebDynamicMenuDefine">
<void property="keymap">
<object class="java.util.HashMap">
<void method="put">
<string>id</string>
<string>parentxzqhwz</string>
</void>
</object>
</void>
<void property="parent">
<string>id</string>
</void>
<void property="child">
<string>parentxzqhwz</string>
</void>
<void property="childValue">
<int>0</int>
<!
新版?/span>jhi应ؓ(f):<string>0</string>
>
</void>
<void property="menuName">
<string>zdtree</string>
</void>
<void property="beanName">
<string>org.hi.zdtree.model.Xzqhwz</string>
</void>
<void property="submenuName">
<string>zdtree</string>
</void>
<void property="title">
<string>行政区划位置</string>
</void>
<void property="titleField">
<string>xzqhwz</string>
</void>
<void property="needShow">
<boolean>true</boolean>
</void>
<void property="javascript">
<string>
function backAgent(id,orgName){
if(opener.document.getElementById('yzjbxx.xzqhwz')!=null){
opener.document.getElementById('yzjbxx.xzqhwz').value=orgName;
}
<!带回到相应的面的相应文本框?/span>
>
else{ opener.document.getElementById('xzqhwz.pxzqhwz').value=orgName;
opener.document.getElementById('xzqhwz.parentxzqhwz.id').value=id;
window.close();
}
}
</string>
</void>
<void property="action">
<string>{js}backAgent([#id],"'[#xzqhwz]"');</string>
<!在树(wi)型结构上通过双击一个节点,获取带回该节点的各上节?/span>
<string>{js}backAgent([#id],"'[#parentxzqhwz.parentxzqhwz.parentxzqhwz.xzqhwz][#parentxzqhwz.parentxzqhwz.xzqhwz][#parentxzqhwz.xzqhwz][#xzqhwz]"');</string>
>
</void>
</object>
</void>
?/span>C:"Program"hi-studio"eclipse"workspace"earch5"web"zdtree"XzqhwzEdit.jsp?/span>
onclick="xzqhwz_lookupPOP('parentxzqhwz')"
改ؓ(f)Q?/span>
onclick="window.open('/tree.action?menuName=zdtree','部门','width=300,height=500,left=10,top=20,location=no,status=no')"
q样Q到Xzqhwz的页面,点击父节点的带回按钮卛_看到效果Q同?/span>lookup?/span>xzqhwz字段的地方也修改Edit.jsp面?/span>onclick动作p啦?/span>
该文档是对J-Hi?wi)Ş的入门介绍QJ-Hi的树(wi)功能q有Q节点的qo(h)Qlazy加蝲Q一个节点可以多个图标、复选框效果Q多个实体组合Ş成一|(wi)Q我们将在以后l讲?/span>
注:(x)该文档由J-Hi爱好?冯思豪"提供,他的QQ号ؓ(f)382600911Q欢q大家与他在技术上多多交流
J-Hi?/span>DWZ两个国内优秀的开源项目强合,携手推出J-Hi4DWZ版?/span>
d面
首页?/span>
J-Hi生成器生成的~辑面Q你不用写M一行代码就能实现富文本~辑、页面校验、上传附件、自动带回、主从表~辑{功?/span>
角色分派面Q可以看到^台提供左侧树(wi)型结构(无需M~码Q简单配|即可)(j)
当然?wi)还可以做成是弹出带回值效?/span>
更新日志Q?/span>
1、融?/span>DWZ富客L(fng)做前端页面展C?/span>
2、支持跨览器包?/span>IE6\7\8\9 FireFox{?/span>
3、实?/span>webwork?/span>struts2无配|文件解x?/span>
4、插件增加?zhn)联机帮?/span>
5、支持实体复?/span>
1、解决登录用L(fng)信息与数据库信息不一致的问题
2、解军_语言标签~存问题
3、生成时如果有从表不在菜单显C?/span>
4、解军_struts下角艌Ӏ权限、h员会(x)有垃圾数据问?/span>
5、增加二个对菜单?wi)的qo(h)的接口,?qing)回调实?/span>
6、修改了(jin)对菜单树(wi)非整数型的配|方?/span>
7、解军_删除标识W的实体未做qo(h)的问?/span>
8、优化了(jin)webwork?/span>struts的基c?/span>BaseAction
开发h员列表:(x)
人员 |
主要工作 |
张慧?/span> |
?/span>dwz集成Q富客户端开?/span> |
杨新?/span> |
Eclipse插g开?/span> |
张昊 |
生成器及(qing)底层开?/span> |
肖金华、a泉 |
修改q_功能面Q修?/span>bug |
试人员列表Q?/span>
|天文、伏占才、宋艺、肖金华、张?/span>
下蝲地址Q?/span>http://code.google.com/p/j-hi/downloads/list
J-HiQ?/span>http://code.google.com/p/j-hi/
DWZQ?/span>http://code.google.com/p/dwz/
U上交流Q?/span>133176937(?/span>),133177634(?/span>),133178083,134232577
相关文章Q?/span>写在J-Hi for DWZ版发布的前夜
下一步计划:(x)
1Q?span style="font: 7pt "Times New Roman";"> 融合SpringJDBC
2Q?span style="font: 7pt "Times New Roman";"> 支持实体从数据库反向导入q生成代?/span>
3Q?span style="font: 7pt "Times New Roman";"> 支持?wi)Şlg的可视化配置
对于刚刚接触J-Hi的h来说Q它上手很容易,我们为每一个功能点都提供了(jin)(zhn)Q帮助功能Q即使没有Q何资料(当然我们已提供了(jin)视频与开发文档)(j)Q?zhn)也可以通过向导与帮助在十分钟之内就可以创徏出?zhn)自己的项目原型?/span>
其次J-Hiq_采用的大都是大家耳熟能详的主框架与技术,如果(zhn)对L的框架有所?jin)解Q那么对J-Hi的学?fn)就没有Md?jin)?/span>
2、快速搭建开发环?/span>
也许(zhn)因为项目或自n开发团队的不同?x)采用不同的框架技术,例如(zhn)团队中?/span>struts2熟?zhn)的hq远要比掌握webwork的工E师要多Q或者在(zhn)的目中统计分析的功能很多Q?zhn)要考虑ORM的效率问题,而不得不攑ּhibernate而采?/span>ibatis?/span>springJDBCQ也许?zhn)q要考虑数据库问题等{。在搭徏开发环境?zhn)一定会(x)考虑很多因素Q尽搭建开发环境ƈ不复杂,但还是不够自动化Q还要手动的配置Q费时费力?/span>J-Hi为快速搭建开发环境提供合理的解决Ҏ(gu)Q?zhn)可以按需求动态的搭徏开发环境?/span>
在此(zhn)可以选择不同?/span>ORM框架
在此(zhn)可以选择不同的表现层框架
在此(zhn)可以选择不同的页面框Ӟq且我们提供?#8220;预览”让?zhn)在搭建开发环境之前就可以看到搭徏后的面昄效果
在此(zhn)可以选择不同的数据库?/span>
3、快速生成所有代?/span>
通过建立或导入模式,(zhn)可以快速的生成所有代码与文gQƈ且在生成时会(x)Ҏ(gu)(zhn)选择的框架技术与数据库的不同而自动适配?/span>
当然(zhn)还可以有选择的生成部分代码文Ӟ例如只生?/span>JSP面Q或只生?/span>java代码。生成的java代码l构如下Q因为我选择的框架是ibatis3+struts2Q所以^C(x)自动匚w只生成与q两个框架相关的cLӞ而不?x)生成无用的其它框架的东西?j)Q?/span>
4、快速解军_业务需求中的技术难?/span>
一般我们在做项目开发时QL要等到项目开发的中、后期才能去解决业务核心(j)问题Q因此很造成无法合理估计目的技术风险。原因是复杂的业务L要等到基模块建好后才能进入到开发阶D,从而解决核心(j)的技术问题置后。我们以一个报销Z来做个简单说明,比如报销在审核后的业务逻辑很复杂ƈ且有可能q要涉及(qing)C其它的系l对接。一般来说我们L要等到这个报销单徏好,L(fng)要有最基本的增删查改功能(即没有面也要有后台的代码Q后才能q入到核?j)业务的开发,q就加大的技术风险,因ؓ(f)我们?x)很早的发现问题Q但解决q些问题却远q的落后于发现这个问题,甚至C(jin)开发的中、后期因为技术问题在底层上还要一改再攏V而?/span>J-Hi可以很快的进入到业务核心(j)的技术上Q因为只要生成,基础功能已l提供,甚至q_qؓ(f)(zhn)提供了(jin)单元试用例c,从而(zhn)可以直指业务核?j),项目风险控制在最低?/span>
5、通过提供通用的组?/span>
q_提供?jin)很多通用业务lgQ例如组l机构、角色权限、报表、定时Q务、菜单管理、日志管理、系l配|、附件上传等{,除此之外q_q提供了(jin)一些纯技术组Ӟ例如?wi)型l构?/span>java脚本工具、编码生成器、可选择性的q回JSON对象{等。这些通用的业务组件与技术组件可以ؓ(f)(zhn)在开发过E节省很多时_(d)随需使用Q从而大大降低开发速度?/span>
6、通过服务的复用性提高开发速度
在介l^台的服务复用性之前,让我们来举个例子。比如?zhn)做?jin)一?/span>OA目其中有一个模块是报销理q个模块很成熟,(zhn)已l在OApȝ中应用了(jin)很久。现在又有一?/span>ERPpȝQ?zhn)xq个成熟的报销理复制?/span>ERPpȝ中,q样q个功能׃用在ERPpȝ中再做开发了(jin)。对于^台来说这是服务的复用性,我们提供?jin)一整套Ҏ(gu)务复用性的解决Ҏ(gu)Qƈ且有自己的可视化工具?/span>
我们叫它J-Hi整合工具Q是?/span>C#做的。它的作用:(x)
1Q可视化导入/导出数据库,q同时实现跨数据库,例如(zhn)可以在mysql上开发(导出Q,开发完所有的数据q移?/span>oracle上(导入Q?/span>
2Q发布器Q可视化?zhn)开发的模块或系l自动发布成一个发布包Q包括数据库?/span>jar、文件[jsp、js、图片、配|文件等]q包括文件的片段[例如修改web.xml文g中的一部分内容]Q?/span>
3Q部|器Q将发布包部|到开发的工程中,部v的内容见发布器的描述
4Q实施器Q对应的生pȝQ我们通过FTPQ将相应的文件与数据库自动部|到生pȝ?/span>
7、快速的部v与迁U?/span>
也许(zhn)正在ؓ(f)客户要求?/span>SQLServer数据库改?/span>Oracle而感到苦|因ؓ(f)q要做大量的数据q移工作Q或许?zhn)反复的将修改后?/span>bug部v到生产环境中而郁P我想J-Hi通过它的整合工具为?zhn)提供了(jin)便L(fng)方式。具体的实现方式请参见上一节的介绍
8、开发h员可以快速的接手别h的工?/span>
因ؓ(f)使用J-Hi开发,生成的代码与文g的风格都是相同的Q在哪里写业务逻辑应该怎么写?在哪里要攚w面应该怎么做?惌到哪张数据库表或表与cȝ对应关系Q包括生成的cR?/span>JSP文g、配|文件的命名规则都是l一的。因此一个新人加入团队会(x)很容易的上手q进入工作状态,即是修改别人写q的代码Q也?x)很快速的定位到相应要修改的位|?/span>
9、快速解决需求变?/span>
对于目开发来_(d)目的需求变更是很正常的事情Q对于有l验的项目经理来_(d)如果一个项目从未发生过需求变更过反而是不正怺(jin):)一但需求变更大多都要改数据库表Q如果是已运行很E_的系l,q种变更真是要命?/span>J-Hi为此也提供了(jin)自己的解x案,对于单表变更Q^台只要对单个实体生成可以了(jin)。如果是复杂的变_(d)我们q提供承实体的解决Ҏ(gu)Q也是说原来的所有代码与表结构都不变Q通过实体l承J-Hi?x)从数据库表?/span>javacd?/span>JSP面形成一整套l承关系Q从而保证以前功能的E_性。这个说来好象很玄妙Q让我们举例说明。比如你有一个部门表Q?/span>N多信息都与它有联p,而且做了(jin)很多的业务处理,现在客户要求在部门表中加另一些信息。对你来说可能会(x)为部门表中加字段Q由此而带来所有类的变化与面的变化,而这套系l已l很E_已经用了(jin)一、两q了(jin)Q开发h员都已经d?jin)公司,q样接手的h要读懂全部代码才有可能改Q这样就造成开发速度的大大降低。^台提供了(jin)另一U解x案:(x)不动以前的Q何东西,相关于在原有的基上打上一块补丁。再做一张表Q让q张表与部门表Ş?/span>one to one的关p,而类无论?/span>POJO?/span>DAO?/span>Service都承自部门相应cM为父c,同时?/span>JSP面上也?x)承所有部门的所有元素,q样Ş成了(jin)实体l承关系Q这好比设计模式中最基本?#8220;开闭原?#8221;Q对于所有的新生功能是开攄Q而对于已有的老功能是关闭的,可以完全把老的功能视ؓ(f)一个黑。这样即能保证已有功能的E_性,又能加入新的功能做ؓ(f)补充?/span>