kodo spring 学习笔记

kodo spring 学习笔记
 

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

 

 

 

你可能感兴趣的:(kodo spring 学习笔记)