?
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
小小程序程序員混口飯吃 閱讀(399)
評論(0) 編輯 收藏 所屬分類:
java