隨筆-109  評(píng)論-187  文章-25  trackbacks-0
          ?

          1 :?jiǎn)伪硖砑舆^程

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

          ?

          ?

          2 1:N 的添加

          ?

          對(duì)于 1 的表,要注意映射對(duì)應(yīng) N 的關(guā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 的對(duì)應(yīng)關(guā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 的對(duì)象中聲明了

          3 1 對(duì)多的關(guān)聯(lián)應(yīng)該在 1 class 中配置好了,去映射 N CLASS ,再 N CLASS 中,也就不需要聲明這個(gè)變量字段了,同時(shí)也不要再 N class 中的配置也不要聲明當(dāng)前的列了, KODO ORM 會(huì)自動(dòng)去映射這個(gè)字段 ( ) ?

          ?

          3 1:N 的查詢問題

          查詢是 KODO 里面的最簡(jiǎn)單功能,但是如何關(guān)聯(lián) 1:N 的查詢,也就是,如果在你查詢到 1 表的數(shù)據(jù),同時(shí)把 N 表的關(guān)聯(lián)數(shù)據(jù)都帶出來呢?

          比如:

          ? Test

          USERID??? USERNAME

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

          ? Test_01

          ID???? USERID? NAME

          1601?? 1600???? TOM

          1602?? 1600???? MIKE

          構(gòu)造查詢條件:

          helper.setQueredClazz(Test.class);

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

          ?

          進(jìn)行查詢

          ?????? 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 :這個(gè)查詢的查詢條件,是不是缺少一些 KODO 所必須的查詢條件????

          ? 2 :如何不關(guān)聯(lián)多表的查詢,和如何關(guān)聯(lián)上多表的查詢(下午繼續(xù)試試!!)

          ?

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

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

          ?? 那么查詢到的結(jié)果的 LIST 就是空的了。

          ?

          3 :一個(gè)對(duì)象在經(jīng)過添加之后這個(gè)對(duì)象已經(jīng)被 persistentManager 設(shè)置成 ATTACHED 狀態(tài)了,要是新取一個(gè)對(duì)象然后通過 pm.getObjectID(Object obj) 這樣得到的永遠(yuǎn)是 NULL ,因?yàn)樗幱?/span> detached 狀態(tài)了。所以你永遠(yuǎn)拿不到他的 objectId

          ?

          4:? 1:n 的修改問題

          1 :首先查詢得到一個(gè)對(duì)象,這個(gè)對(duì)象可以把他 attach 也可以 detach ,不過無論如何都可以拿到他的 ojbectid ,因?yàn)椋梢酝ㄟ^反射來拿他的 ID ,即使他已經(jīng)被 detach 了,如果沒有 detach 可以直接通過 pm.getObjectId(Object obj) 拿到 objectId ,這些查詢都可以拿到結(jié)果

          ?

          2 :如何修改,以及如何修改其關(guān)聯(lián)!

          ?? 我修改一個(gè) a----------1:n----------------b

          ?? 1 :修改了 a 成功

          ?? 2 :修改了 a 相關(guān)聯(lián)的其中一個(gè) b ,但是沒有成功,調(diào)試找原因中。。。。。。。。

          ?? 原因如下 :

          因?yàn)樵?/span> b 表中沒有設(shè)置主鍵,不知道怎么多出一條一樣的數(shù)據(jù)來,原來 KODO 更新一個(gè)表的時(shí)候,他根據(jù)主鍵來更新表,這個(gè)主鍵就是在 CLASS 中設(shè)置的主鍵,要是只是在 CLASS 中設(shè)置而不在表中設(shè)置,也就是說 *.JDO 的配置主鍵與實(shí)際表不一致的時(shí)候,如果表不設(shè)置主鍵,拿就意味著他更新了與 CLASS 相關(guān)主鍵的所有信息,所以一定要保持 .JDO 的配置與表的一致!!否則有寫危險(xiǎn)。

          ?

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

          1: 關(guān)聯(lián)刪除和非關(guān)聯(lián)刪除

          ?1 :主表設(shè)置

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

          TODO

          ?

          沒有完成理解,以后繼續(xù) ….

          ?

          原因是這樣的:用法錯(cuò)誤!!

          應(yīng)該在 1 表中這樣配置,刪除的時(shí)候級(jí)聯(lián)了 n 表的數(shù)據(jù),并且刪除成功!

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

          ?

          ?

          ?

          ?

          6? 實(shí)體對(duì)象的 3 種狀態(tài)

          ?1 Transient (自由狀態(tài) (VO)

          2 Persistent (持久狀態(tài)) (PO)

          ? 一個(gè)處于 Persitent 的對(duì)象被 Delete 之后就變成了 Transient 狀態(tài)因?yàn)?/span> Id null 了吧,(自己猜的,有待驗(yàn)證

          ?

          3: Detached (游離狀態(tài)) (VO)

          ?

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

          ?

          ?

          ?

          7? 什么是臟數(shù)據(jù)

          ?

          臟數(shù)據(jù)并非廢棄或者無用的數(shù)據(jù),而是指一個(gè)數(shù)據(jù)對(duì)象所攜帶的信息發(fā)生了改變后的狀態(tài)

          ?

          ?

          ?

          ?

          8 對(duì)與 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 的類中,只要加一個(gè) ??? private byte[] userobj; 就可以搞定

          ?

          9 ???????????????? 1 n 表的添加在從表開始添加,從表級(jí)聯(liá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>

          ?

          ?

          從表的類多了一項(xiàng): 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);

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

          ?

          添加沒有問題,但是從 n 表刪除數(shù)據(jù)的時(shí)候,只能刪除 N 表中的數(shù)據(jù),但是 1 表數(shù)據(jù)并沒有刪除,并且還會(huì)拋出一個(gè)異常出來。

          ?

          10 ?????????? 關(guān)系型數(shù)據(jù)庫與面向?qū)ο髷?shù)據(jù)結(jié)構(gòu)之間的關(guān)系

          ?1 Table per concrete class

          表與子類之間獨(dú)立的 1 1

          ?2 Table per sub class

          每個(gè)子類對(duì)應(yīng)一張子表,并與主類共享主表

          ?3 Table per class hierachy

          表與類是 1 n 關(guān)系 ????? -

          ?

          ?

          ?

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

          ?Jdo ENHANCE 一個(gè)對(duì)象,在編譯之后進(jìn)行 ENHANCE ,就是插入一些 2 進(jìn)制的字節(jié)碼,增加一些方法,和屬性比如序列化攔截器等,如果一個(gè)對(duì)象處于 ATTACH 狀態(tài)在 SET 之后數(shù)據(jù)庫就發(fā)生變化,這是為什么呢?就是因?yàn)?/span> ENHANCER 起的作用, ENHANCE 之后增加一些 OBSERVER SET 之后馬上觸發(fā)程序使數(shù)據(jù)庫發(fā)生了變化,如果沒有 ENHANCE 則不會(huì)發(fā)生變化,真是受益匪淺啊

          ?

          ?

          12 ?????????? 關(guān)聯(lián)(未結(jié)束)

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

          B.??????? 如果設(shè)置了 inverse-owner inverse-logical 有一下幾個(gè)屬性

          ?

          ?? 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.??????? 多對(duì)多的關(guān)系

          ? ?? ? <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 ?????????? ? 類之間的繼承關(guān)系和表之間的關(guān)聯(lián)關(guān)系 ??

          jdbc-class-ind-name

          ?

          ?

          ?

          ?

          14 ?????????? attach pm 的關(guān)系

          ? 一個(gè)對(duì)象在沒有處于 ATTCH 狀態(tài)的時(shí)候用 PM 對(duì)其進(jìn)行 deletepersistence 是不會(huì)成功的,因?yàn)椋?/span> OBJECT 并沒有處于 PM 的管理狀態(tài),就是說當(dāng)前的對(duì)象沒有 object ID, 要是想刪除成功,必須先進(jìn)行 attach ,要是對(duì) object 進(jìn)行 makepersistence 操作就不不必進(jìn)行 ATTACH 操作了,因?yàn)楫?dāng)前 object 與數(shù)據(jù)庫并沒有關(guān)系,也就是說當(dāng)前對(duì)象并沒有存在數(shù)據(jù)庫中,知識(shí)一個(gè)添加操作而已。

          ?

          ?

          15 ?????????? KODO 識(shí)別 SCHEME 和數(shù)據(jù)庫權(quán)限的問題

          要是給予 KODO.PROPERTY 里面設(shè)立的用戶 DBA 的權(quán)限, KODO 可以隨機(jī)的選擇 SCHEME ,而不是指定的 SCHEME ,當(dāng)去掉 DBA 的權(quán)限的時(shí)候此問題就可以解決掉,郁悶啊,有時(shí)間取官方網(wǎng)站看看到底是不是配置的問題,或者其他問題

          其實(shí) KODO 里面有個(gè)數(shù)據(jù)庫的配置,

          kodo.jdbc.DBDictionary: DefaultSchemaName

          如果聯(lián)系定義的 2 個(gè) DBDictionary, 那么下面的將覆蓋了上面的,會(huì)出現(xiàn), SCHEMA 亂掉的情況,如果注釋掉下面的那行,就可以搞定了,不會(huì)出現(xiàn)錯(cuò)誤了

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

          kodo.jdbc.DBDictionary: BatchLimit=500

          ?

          ?

          ?

          posted on 2006-04-13 08:49 小小程序程序員混口飯吃 閱讀(404) 評(píng)論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 梁平县| 阜城县| 乌兰浩特市| 丹江口市| 彰化县| 定安县| 社旗县| 龙胜| 上林县| 锡林郭勒盟| 文安县| 溧水县| 邵阳市| 兴海县| 裕民县| 得荣县| 遂川县| 芜湖县| 马公市| 托里县| 连州市| 建宁县| 司法| 普格县| 黑河市| 冕宁县| 安丘市| 和田县| 长汀县| 达孜县| 嘉鱼县| 新昌县| 横山县| 河源市| 阿勒泰市| 乐平市| 海阳市| 内黄县| 义马市| 电白县| 平武县|