您的位置:首页 > 其它

newxy新坐标DAO类对表结构的注册过程,及表结构变化的影响

2006-08-20 09:43 337 查看
[align=center]newxy(新坐标)DAO类对表结构的注册过程,及表结构变化的影响[/align]
[align=center][/align]
在开发过程中,服务器已启动,如果改变了表的结构,程序可能会运行错误,这与DAO类的注册方法有关。为什么会发生错误,如何解决?
下面从五个方面讲解。
一、DAO类对表结构的即时注册
newxy(新坐标)的DAO类在进行数据的查询、增、删、改时都会调用一注册方法,根据业务涉及到的数据库相关数据源名和表名进行注册, 注册的目的是要获得表字段对应的java类名,主关键字段名,主关键字段长度等数据,保存在一个单子实例中,以供DAO类调用。 如果已注册不再注册。
设有如下代码:
net.newxy.dbm.BaseDAO dao=new net.newxy.dbm.BaseDAO();
net.newxy.dbm.DynaDto dynaDto=net.newxy.dbm.DynaDto();
dynaDto.set_table(“table1”);
dynaDto.set(“field1”,”......”);
dao.update(dynaDto);
dao.update(dynaDto)过程中DAO类会对表的结构进行注册:根据数据源的资源名、表名获取表的结构信息,包括字段对应的java类名,主关键字段名,主关键字段长度等信息,登记注册到net.newxy.dbm.TableProperties类的单例中,如果已注册,不再注册。
二、持久类与表的影射
注册后,DAO将持久类影射到表,过程是这样的:
持久类<-->注册信息<-->。。
正确影射的条件是:
1、dynaDto.set(fieldName,value)句设置的字段已注册,如果dynaDto.set(fieldName,value)句设置的字段没有注册,属性fieldName将被略,运行正常。
2、注册的字段名及java类型与表的字段名与java类型相这致。
三、表结构变化的影响
如果dao.update(dynaDto)执行过后,改变了表的结构,而服务器又没有重启,这时再执行dao.update(dynaDto)会存在下列情况:
1、改变了表名
会返回数据库报告的“表不存在”之类的错误。这是因为语句dynaDto.set_table(“table1”)设定的表名在数据库中不存在。
2、改变了表字段名,设原字段名是“field1”,改为“field2”,这分两种情况:
(1)、已运行了dynaDto.set(“field1”,value)句,会返回数据库报告的“表中没有字段field1”之类的错误。
(2)、没有运行dynaDto.set(“field1”,value)句,会正常运行。
3、删除了字段,如删除了字段field1,而且已运行了dynaDto.set(“field1”,value),会返回“表中没有字段field1”之类的错误,否则会正常运行。
4、增加了字段,如增加了字段field2,会正常运行。如果增加了语句dynaDto.set(“field2”,value2),虽然运行正常,但表的field2不受影响,因为table1注册的信息中不含field2。
5、改变了字段类型,这分几种情况:
(1)、改变后的字段类型与之前的类型对应的java类型相同,大部分数据库char、varchar字段类型对应的java类型都是String类型,会正常运行。
(2)、改变后的字段类型与之前的类型对应的java类型不相同,这又分两种情况,可能会出错,可能不出错,在此不细说。
四、通用持久类从通用formBean类得到了什么数据
用户submit数据,在后台将上传的数据绑定到formBean中;通过下列语句得到持久类实例:
DynaFormBean form=(DynaFormBean)actionForm;

DynaDto dto=(DynaDto)form.getDto();

持久类包含了上传的所有数据。

虽然用户上传的数据都保存在dto中,但只有那些属性名已在注册信息中,才能与表影射,注册信息是直接来源于表的,所以dto中只有那些与表中字段同名的属性,才能更新表中已存在信息,或插入表中。
五、解决办法
1、最简单的办法是重启服务器,运用系统运行时重新注册表信息。
2、在开发环境下建一jsp文件,将下列代码拷到jsp文件中,运行jsp文件,点击"清除表注册信息"按钮清除注册信息,无需重启服务器。

<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>

<html>
<head>
<title>
开发者帮助
</title>
</head>
<body bgcolor="#ffffff">
<%
String url=((javax.servlet.http.HttpServletRequest)pageContext.getRequest()).getRequestURI();
pageContext.setAttribute("url",url);
%>
<logic:present parameter="method">
<bean:parameter id="method" name="method"/>
<logic:equal value="clearTableProperties" name="method">
<%
net.newxy.dbm.TableProperties.clear();
%>
<script type="text/javascript">
alert("注册信息已清除,无需重启服务器!")
</script>
</logic:equal>
</logic:present>
<h1>
开发者帮助
</h1>
<p>
    在开发过程中改变了数据库表结构,jsp页面表单中的属性名作相应改变。但原来表的信息可能已注册,需要清除已经注册的信息,否则会出现错误,除非你重启web服务器。
点击后面的按钮来清除注册信息,web服务器无需重启。
<input type="button" value="清除表的注册信息" onclick="window.location='${url}'+'?method=clearTableProperties';"/>
</p>
</body>
</html>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐