隨筆-109  評論-187  文章-25  trackbacks-0
          ?

          1 :單表添加過程

          添加單表的過程非常簡單直接寫一個對象就可以,最關鍵的是處理主鍵,主鍵的 SEQUERCE 的生成,(不過還不太懂如何去配置 SEQUENCE 的生成)

          ?

          ?

          2 1:N 的添加

          ?

          對于 1 的表,要注意映射對應 N 的關系

          比如采用如下形式:

          ?

          CREATE TABLE TEST

          (

          ? USERID??? INTEGER ???????????????????????????? NOT NULL,

          ? USERNAME? VARCHAR2 ( 100 BYTE )

          )

          ?

          CREATE TABLE TEST_01

          (

          ? ID????? NUMBER ,

          ? USERID? NUMBER ,

          ? NAME??? VARCHAR2 ( 100 BYTE )

          )

          ?

          ?

          ??? <!--table TEST-->

          ??????? <class name="Test">

          ????????????? <extension vendor-name="kodo" key="detachable" value="true"/>

          ????????????? <extension vendor-name="kodo" key="jdbc-class-ind-name" value="none"/>

          ????????????? <extension vendor-name="kodo" key="jdbc-class-map" value="base">

          ?????????????????? <extension vendor-name="kodo" key="pk-column" value="USERID"/>

          ?????????????????? <extension vendor-name="kodo" key="table" value="TEST"/>

          ???????????? </extension>?

          ???????????? <field name="userName" default-fetch-group="true">

          ??????????????? <extension vendor-name="kodo" key="jdbc-field-map" value="value">

          ??????????????????? <extension vendor-name="kodo" key="column" value="USERNAME"/>

          ??????????????? </extension>

          ??????????? </field>

          ?????????? <field name="list" default-fetch-group="true">

          ??????????? ??? <collection element-type="Test_01"/>

          ?????? 1:n 的對應關系在此 ?????????? ??? <extension vendor-name="kodo" key="jdbc-delete-action" value="cascade"/>???????????

          ??????????????? <extension vendor-name="kodo" key="jdbc-field-map" value="one-many">???????????????

          ??????????????? ??? <extension vendor-name="kodo" key="table" value="TEST_01"/>

          ??????????????? ??? <extension vendor-name="kodo" key="ref-column.USERID" value="USERID"/>

          ??????????????? </extension>???????????

          ??????????? </field>

          ???????? </class>?

          ?? <!--table TEST_01-->?????

          ?????? <class name="Test_01">

          ?????? ???????<extension vendor-name="kodo" key="detachable" value="true"/>

          ????????????? <extension vendor-name="kodo" key="jdbc-class-ind-name" value="none"/>

          ????????????? <extension vendor-name="kodo" key="jdbc-class-map" value="base">

          ?????????????????? <extension vendor-name="kodo" key="pk-column" value="ID"/>

          ?????????????????? <extension vendor-name="kodo" key="table" value="TEST_01"/>

          ???????????? </extension>?

          ???????????? <field name="name" default-fetch-group="true">

          ??????????????? <extension vendor-name="kodo" key="jdbc-field-map" value="value">

          ??????????????????? <extension vendor-name="kodo" key="column" value="NAME"/>

          ??????????????? </extension>

          ??????????? </field>

          ???????????? <!--field name="userId" default-fetch-group="true">

          ?????????????? ?<extension vendor-name="kodo" key="jdbc-field-map" value="value">

          ??????????????????? <extension vendor-name="kodo" key="column" value="USERID"/>

          ??????????????? </extension>

          ??????????? </field-->

          ??????? </class>?

          注意一下的問題:

          ? 1 :主鍵的生成

          ? 2 :主要是主鍵的生成,在 .JDO 文件中配置好了,就不需要再在 PO 的對象中聲明了

          3 1 對多的關聯應該在 1 class 中配置好了,去映射 N CLASS ,再 N CLASS 中,也就不需要聲明這個變量字段了,同時也不要再 N class 中的配置也不要聲明當前的列了, KODO ORM 會自動去映射這個字段 ( ) ?

          ?

          3 1:N 的查詢問題

          查詢是 KODO 里面的最簡單功能,但是如何關聯 1:N 的查詢,也就是,如果在你查詢到 1 表的數據,同時把 N 表的關聯數據都帶出來呢?

          比如:

          ? Test

          USERID??? USERNAME

          1600???????????????????????????? 11111

          ? Test_01

          ID???? USERID? NAME

          1601?? 1600???? TOM

          1602?? 1600???? MIKE

          構造查詢條件:

          helper.setQueredClazz(Test.class);

          helper.getWheres().put("userName","11111");

          ?

          進行查詢

          ?????? public List getAllTest(final SearchHelper helper) {

          ?????????????

          ????????????? return (List)getJdoTemplate().execute(new JdoCallback(){

          ????????????? ?????? public Object doInJdo(PersistenceManager srcPM) throws JDOException {

          ???????????????????? ?????? KodoPersistenceManager pm = (KodoPersistenceManager)srcPM;

          ???????????????????? ?????? List list = new ArrayList();

          ???????????????????? ?????? KodoQuery query = null;

          ???????????????????? ?????? try{

          ???????????????????? ????????????? query = (KodoQuery) pm.newQuery(helper.getQueredClazz());

          ???????????????????? ?????? }catch(Exception e){

          ???????????????????? ?????? ?????? e.printStackTrace();

          ???????????????????? ?????? }

          ???????????????????? ?????? list = (List)pm.detachAll((Collection)query.executeWithMap(helper.getParams()));

          ???????????????????? ?????? return list;

          ???????????????????? }

          ????????????? });

          ?

          ?????? }

          注意問題

          ? 1 :這個查詢的查詢條件,是不是缺少一些 KODO 所必須的查詢條件????

          ? 2 :如何不關聯多表的查詢,和如何關聯上多表的查詢(下午繼續試試!!)

          ?

          ?? 如果想不帶出來: <field name="list" default-fetch-group="false">

          ?? 如果想連帶 N 表的數據一起查詢出來 default-fetch-group=”true” 設置一下就可以

          ?? 那么查詢到的結果的 LIST 就是空的了。

          ?

          3 :一個對象在經過添加之后這個對象已經被 persistentManager 設置成 ATTACHED 狀態了,要是新取一個對象然后通過 pm.getObjectID(Object obj) 這樣得到的永遠是 NULL ,因為他處于 detached 狀態了。所以你永遠拿不到他的 objectId

          ?

          4:? 1:n 的修改問題

          1 :首先查詢得到一個對象,這個對象可以把他 attach 也可以 detach ,不過無論如何都可以拿到他的 ojbectid ,因為,可以通過反射來拿他的 ID ,即使他已經被 detach 了,如果沒有 detach 可以直接通過 pm.getObjectId(Object obj) 拿到 objectId ,這些查詢都可以拿到結果

          ?

          2 :如何修改,以及如何修改其關聯!

          ?? 我修改一個 a----------1:n----------------b

          ?? 1 :修改了 a 成功

          ?? 2 :修改了 a 相關聯的其中一個 b ,但是沒有成功,調試找原因中。。。。。。。。

          ?? 原因如下 :

          因為在 b 表中沒有設置主鍵,不知道怎么多出一條一樣的數據來,原來 KODO 更新一個表的時候,他根據主鍵來更新表,這個主鍵就是在 CLASS 中設置的主鍵,要是只是在 CLASS 中設置而不在表中設置,也就是說 *.JDO 的配置主鍵與實際表不一致的時候,如果表不設置主鍵,拿就意味著他更新了與 CLASS 相關主鍵的所有信息,所以一定要保持 .JDO 的配置與表的一致!!否則有寫危險。

          ?

          5 ???????????????? 1:n 的刪除問題

          1: 關聯刪除和非關聯刪除

          ?1 :主表設置

          ?<extension vendor-name="kodo" key="jdbc-delete-action" value="cascade"/> 之后在數據庫 n 表中還是沒有刪除關聯的數據,只是把關聯的數據置成 null 了。

          TODO

          ?

          沒有完成理解,以后繼續 ….

          ?

          原因是這樣的:用法錯誤!!

          應該在 1 表中這樣配置,刪除的時候級聯了 n 表的數據,并且刪除成功!

          <extension vendor-name="kodo" key="element-dependent" value="true"/>

          ?

          ?

          ?

          ?

          6? 實體對象的 3 種狀態

          ?1 Transient (自由狀態 (VO)

          2 Persistent (持久狀態) (PO)

          ? 一個處于 Persitent 的對象被 Delete 之后就變成了 Transient 狀態因為 Id null 了吧,(自己猜的,有待驗證

          ?

          3: Detached (游離狀態) (VO)

          ?

          Detached 對象包含了主鍵的值,或者說對象的值,而 Transient 對象就不包含。

          ?

          ?

          ?

          7? 什么是臟數據

          ?

          臟數據并非廢棄或者無用的數據,而是指一個數據對象所攜帶的信息發生了改變后的狀態

          ?

          ?

          ?

          ?

          8 對與 blob 字段的使用

          ? ????????<field name="userobj" default-fetch-group="true">

          ????????? ??? <extension vendor-name="kodo" key="jdbc-field-map" value="byte-array">

          ?????????? ??? ??? <extension vendor-name="kodo" key="column" value="USEROBJ"/>

          ?????? ??? </extension>

          ???????? </field>

          Test 的類中,只要加一個 ??? private byte[] userobj; 就可以搞定

          ?

          9 ???????????????? 1 n 表的添加在從表開始添加,從表級聯主表,雙向映射的問題!

          從表配置如下: ???????????? <field name="test" default-fetch-group="true">

          ??????????????? <extension vendor-name="kodo" key="jdbc-field-map" value="one-one">

          ??????????????????? <extension vendor-name="kodo" key="column.USERID" value="userId"/>

          ?????????????? </extension>

          ?????????? </field>

          ?

          ?

          從表的類多了一項: public Test test;

          ?????? ?????? Test_01 test_01 = new Test_01();

          ?????? ?????? test_01.setName("form nnnn");

          ????????????? Test test = new Test();

          ?????? ?????? test.setUserName("form NNNN");

          ?????? ?????? test_01.setTest(test);

          ?????? ?????? service.addTestFromN(test_01);

          這樣添加從表的時候主表也添加成功了 !!!!!! 注意這個從表添加一條記錄,如果從表添加 2 條記錄如何???? ??? ??????

          ?

          添加沒有問題,但是從 n 表刪除數據的時候,只能刪除 N 表中的數據,但是 1 表數據并沒有刪除,并且還會拋出一個異常出來。

          ?

          10 ?????????? 關系型數據庫與面向對象數據結構之間的關系

          ?1 Table per concrete class

          表與子類之間獨立的 1 1

          ?2 Table per sub class

          每個子類對應一張子表,并與主類共享主表

          ?3 Table per class hierachy

          表與類是 1 n 關系 ????? -

          ?

          ?

          ?

          11 ?????????? ENHANCE 原理

          ?Jdo ENHANCE 一個對象,在編譯之后進行 ENHANCE ,就是插入一些 2 進制的字節碼,增加一些方法,和屬性比如序列化攔截器等,如果一個對象處于 ATTACH 狀態在 SET 之后數據庫就發生變化,這是為什么呢?就是因為 ENHANCER 起的作用, ENHANCE 之后增加一些 OBSERVER SET 之后馬上觸發程序使數據庫發生了變化,如果沒有 ENHANCE 則不會發生變化,真是受益匪淺啊

          ?

          ?

          12 ?????????? 關聯(未結束)

          A.??????? 如果設置了雙向管理一定要互相 SET 否則 KODO 拋異常出來

          B.??????? 如果設置了 inverse-owner inverse-logical 有一下幾個屬性

          ?

          ?? Inverse-owner

          <extension vendor-name="kodo" key="inverse-owner" value="group"/>

          KODO 的原文:

          Use the inverse-owner field extension to indicate that this field is part of a two-sided relation with the named field, and that the named field owns the relation. The named field should not also have this extension; only one field can be the owner. See below for an example

          ? ?inverse-logical?

          C.??????? 多對多的關系

          ? ?? ? <field name="firmwareTags" default-fetch-group="true">

          ???????? <collection element-type="FirmwareTag"/>

          ???????? <extension vendor-name="kodo" key="jdbc-field-map" value="many-many">

          ???????????? <extension vendor-name="kodo" key="element-column.FIRMWARE_TAG_ID"

          ???????????????? value="FIRMWARE_TAG_ID"/>

          ???????????? <extension vendor-name="kodo" key="table" value="MVP_SUBSCRIBERCLASS_FWTAG"/>

          ???????????? <extension vendor-name="kodo" key="ref-column.SUBSCRIBER_CLASS_ID" value="SUBSCRIBER_CLASS_ID"/>

          ???????? </extension>

          ??? ? </field>

          ?

          ?

          ?

          ?

          ?

          ?

          13 ?????????? ? 類之間的繼承關系和表之間的關聯關系 ??

          jdbc-class-ind-name

          ?

          ?

          ?

          ?

          14 ?????????? attach pm 的關系

          ? 一個對象在沒有處于 ATTCH 狀態的時候用 PM 對其進行 deletepersistence 是不會成功的,因為, OBJECT 并沒有處于 PM 的管理狀態,就是說當前的對象沒有 object ID, 要是想刪除成功,必須先進行 attach ,要是對 object 進行 makepersistence 操作就不不必進行 ATTACH 操作了,因為當前 object 與數據庫并沒有關系,也就是說當前對象并沒有存在數據庫中,知識一個添加操作而已。

          ?

          ?

          15 ?????????? KODO 識別 SCHEME 和數據庫權限的問題

          要是給予 KODO.PROPERTY 里面設立的用戶 DBA 的權限, KODO 可以隨機的選擇 SCHEME ,而不是指定的 SCHEME ,當去掉 DBA 的權限的時候此問題就可以解決掉,郁悶啊,有時間取官方網站看看到底是不是配置的問題,或者其他問題

          其實 KODO 里面有個數據庫的配置,

          kodo.jdbc.DBDictionary: DefaultSchemaName

          如果聯系定義的 2 DBDictionary, 那么下面的將覆蓋了上面的,會出現, SCHEMA 亂掉的情況,如果注釋掉下面的那行,就可以搞定了,不會出現錯誤了

          kodo.jdbc.DBDictionary: DefaultSchemaName=cmccod,BatchLimit=500

          kodo.jdbc.DBDictionary: BatchLimit=500

          ?

          ?

          ?

          posted on 2006-04-13 08:49 小小程序程序員混口飯吃 閱讀(400) 評論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 泽州县| 大竹县| 浪卡子县| 上饶市| 海兴县| 湘阴县| 瑞安市| 彝良县| 平武县| 惠东县| 湘潭县| 荥阳市| 新密市| 廊坊市| 台江县| 孙吴县| 庄浪县| 慈利县| 依安县| 玉田县| 通许县| 久治县| 武宁县| 科技| 安乡县| 南涧| 肃宁县| 德清县| 湘潭县| 鲁甸县| 理塘县| 隆昌县| 迁西县| 津南区| 克东县| 苗栗县| 祥云县| 南郑县| 扶风县| 兴义市| 弋阳县|