隨筆-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新坐標 閱讀(436) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2006年8月>
          303112345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(4)

          隨筆檔案(39)

          文章分類

          GIS技術及運用

          struts

          實用代碼

          報表

          軟件工程

          搜索

          •  

          積分與排名

          • 積分 - 44075
          • 排名 - 1090

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 盱眙县| 巴马| 通渭县| 江孜县| 洪雅县| 新昌县| 平安县| 美姑县| 黄大仙区| 桐柏县| 萨嘎县| 西乡县| 阿拉善左旗| 贵州省| 明光市| 安庆市| 二连浩特市| 鹰潭市| 莆田市| 长宁区| 大余县| 东乡| 石屏县| 建水县| 泉州市| 聂拉木县| 富锦市| 太白县| 长沙县| 吉木乃县| 榆中县| 乡宁县| 绥阳县| 萝北县| 吴旗县| 依兰县| 渑池县| 桑日县| 黄陵县| 七台河市| 永泰县|