<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-39  評論-33  文章-0  trackbacks-0
    在開發(fā)過程中,服務(wù)器已啟動,如果改變了表的結(jié)構(gòu),程序可能會運行錯誤,這與DAO類的注冊方法有關(guān)。為什么會發(fā)生錯誤,如何解決?
    下面從五個方面講解。
    一、DAO 類對表結(jié)構(gòu)的即時注冊
    newxy(新坐標(biāo))的DAO類在進行數(shù)據(jù)的查詢、增、刪、改時都會調(diào)用一注冊方法,根據(jù)業(yè)務(wù)涉及到的數(shù)據(jù)庫相關(guān)數(shù)據(jù)源名和表名進行注冊, 注冊的目的是要獲得表字段對應(yīng)的java類名,主關(guān)鍵字段名,主關(guān)鍵字段長度等數(shù)據(jù),保存在一個單子實例中,以供DAO類調(diào)用。 如果已注冊不再注冊。
    設(shè)有如下代碼:
    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類會對表的結(jié)構(gòu)進行注冊:根據(jù)數(shù)據(jù)源的資源名、表名獲取表的結(jié)構(gòu)信息,包括字段對應(yīng)的java類名,主關(guān)鍵字段名,主關(guān)鍵字段長度等信息,登記注冊到net.newxy.dbm.TableProperties類的單例中,如果已注冊,不再注冊。
    二、持久類與表的影射
    注冊后,DAO將持久類影射到表,過程是這樣的:
    ??? 持久類<-->注冊信息<-->
    正確影射的條件是:
    1、dynaDto.set(fieldName,value)句設(shè)置的字段已注冊,如果dynaDto.set(fieldName,value)句設(shè)置的字段沒有注冊,屬性fieldName將被略,運行正常。
    ???? 2、注冊的字段名及java類型與表的字段名與java類型相這致。
    三、表結(jié)構(gòu)變化的影響
    如果dao.update(dynaDto)執(zhí)行過后,改變了表的結(jié)構(gòu),而服務(wù)器又沒有重啟,這時再執(zhí)行dao.update(dynaDto)會存在下列情況:
    1、改變了表名
    會返回數(shù)據(jù)庫報告的“表不存在”之類的錯誤。這是因為語句dynaDto.set_table(“table1”)設(shè)定的表名在數(shù)據(jù)庫中不存在。
    2、改變了表字段名,設(shè)原字段名是“field1”,改為“field2”,這分兩種情況:
    (1)、已運行了dynaDto.set(“field1”,value)句,會返回數(shù)據(jù)庫報告的“表中沒有字段field1”之類的錯誤。
    (2)、沒有運行dynaDto.set(“field1”,value)句,會正常運行。
    3、刪除了字段,如刪除了字段field1,而且已運行了dynaDto.set(“field1”,value),會返回“表中沒有字段field1”之類的錯誤,否則會正常運行。
    4、增加了字段,如增加了字段field2,會正常運行。如果增加了語句dynaDto.set(“field2”,value2),雖然運行正常,但表的field2不受影響,因為table1注冊的信息中不含field2。
    5、改變了字段類型,這分幾種情況:
    (1)、改變后的字段類型與之前的類型對應(yīng)的java類型相同,大部分?jǐn)?shù)據(jù)庫char、varchar字段類型對應(yīng)的java類型都是String類型,會正常運行。
    (2)、改變后的字段類型與之前的類型對應(yīng)的java類型不相同,這又分兩種情況,可能會出錯,可能不出錯,在此不細說。
    四、通用持久類從通用formBean 類得到了什么數(shù)據(jù) ??
    用戶submit數(shù)據(jù),在后臺將上傳的數(shù)據(jù)綁定到formBean中;通過下列語句得到持久類實例:
    ?????????????????????
    DynaFormBean form=(DynaFormBean)actionForm;
    ?
    DynaDto dto=(DynaDto)form.getDto();
    持久類包含了上傳的所有數(shù)據(jù)。
    ??? ??? 雖然用戶上傳的數(shù)據(jù)都保存在dto中,但只有那些屬性名已在注冊信息中,才能與表影射,注冊信息是直接來源于表的,所以dto中只有那些與表中字段同名的屬性,才能更新表中已存在信息,或插入表中。
    五、解決辦法
    1、最簡單的辦法是重啟服務(wù)器,運用系統(tǒng)運行時重新注冊表信息。
    2、在開發(fā)環(huán)境下建一jsp文件,將下列代碼拷到j(luò)sp文件中,運行jsp文件,點擊"清除表注冊信息"按鈕清除注冊信息,無需重啟服務(wù)器。
    ?
    <%@ 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>
    開發(fā)者幫助
    </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("注冊信息已清除,無需重啟服務(wù)器!")
    ??? </script>
    ?</logic:equal>
    </logic:present>
    <h1>
    開發(fā)者幫助
    </h1>
    <p>
    在開發(fā)過程中改變了數(shù)據(jù)庫表結(jié)構(gòu),jsp頁面表單中的屬性名作相應(yīng)改變。但原來表的信息可能已注冊,需要清除已經(jīng)注冊的信息,否則會出現(xiàn)錯誤,除非你重啟web服務(wù)器。
    點擊后面的按鈕來清除注冊信息,web服務(wù)器無需重啟。
    <input type="button" value="清除表的注冊信息" onclick="window.location='${url}'+'?method=clearTableProperties';"/>
    </p>
    </body>
    </html>
    ?
    posted on 2006-08-21 17:52 newxy新坐標(biāo) 閱讀(432) 評論(0)  編輯  收藏

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


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 在线观看免费大黄网站| 亚洲人成小说网站色| 久久精品国产亚洲AV不卡| 又黄又大又爽免费视频| 国产在线19禁免费观看| 国产在线观看www鲁啊鲁免费| 女人18毛片水真多免费看| 免费视频淫片aa毛片| 韩国欧洲一级毛片免费| 免费国产一级特黄久久| 国产午夜免费福利红片| jjzz亚洲亚洲女人| 亚洲综合最新无码专区| 国产亚洲精品xxx| 午夜亚洲AV日韩AV无码大全| 亚洲日本中文字幕区| 亚洲精品午夜视频| 亚洲成a人片在线观看精品| 一区二区亚洲精品精华液 | 日韩精品免费电影| 精品国产免费观看一区| 久久久久亚洲AV无码专区首JN| 亚洲成在人天堂一区二区| 亚洲精品中文字幕无码AV| 久久精品国产亚洲AV蜜臀色欲| 亚洲人成77777在线播放网站不卡 亚洲人成77777在线观看网 | caoporm超免费公开视频| aaa毛片免费观看| 久久精品人成免费| 免费a级毛片无码a∨蜜芽试看 | 人人揉揉香蕉大免费不卡| 在线人成精品免费视频| 最近最好的中文字幕2019免费 | 免费无码VA一区二区三区| 2020久久精品国产免费| 国产高清免费在线| 亚洲区小说区图片区QVOD| 亚洲精品美女在线观看| 亚洲国产精华液2020| 一级毛片在线播放免费| 91精品免费不卡在线观看|