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