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
?
?
?