随笔-39  评论-33  文章-0  trackbacks-0
在开发过程中,服务器已启动,如果改变了表的结构,程序可能会运行错误,这与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>
 
posted on 2006-08-21 17:52 newxy新坐标 阅读(431) 评论(0)  编辑  收藏

只有注册用户登录后才能发表评论。


网站导航: