<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 64,comments - 22,trackbacks - 0
    ofbiz 之entity實(shí)體
    1. 實(shí)體定義文件
    實(shí)體定義文件一般存放位置是在對(duì)應(yīng)模塊的entity文件夾下面,以party為例,party的實(shí)體定義文件路徑為%ofbiz-home%\applications\party\entitydef\entitymodel.xml。
    通過(guò)對(duì)應(yīng)模塊的ofbiz-component.xml進(jìn)行加載。
       <entity-resource type="model" reader-name="main" loader="main" location="entitydef/entitymodel.xml"/>
    <entity-resource type="model" reader-name="main" loader="main" location="entitydef/entitymodel_old.xml"/>
    實(shí)體定義文件可以為多個(gè)。
    2. 實(shí)體類型
    2.1. 普通實(shí)體
    <entity entity-name="TenantDataSource" package-name="org.ofbiz.entity.tenant">
            <description>
                There should be one record for each tenant and each group-map for the active delegator.
                The jdbc fields will override the datasource -> inline-jdbc values for the per-tenant delegator.
            </description>
            <field name="tenantId" type="id-ne"/>
            <field name="entityGroupName" type="name"/>
            <field name="jdbcUri" type="long-varchar"/>
            <field name="jdbcUsername" type="long-varchar"/>
            <field name="jdbcPassword" type="long-varchar"></field>
            <prim-key field="tenantId"/>
            <prim-key field="entityGroupName"/>
            <relation type="one" fk-name="TNTDTSRC_TNT" rel-entity-name="Tenant">
            <key-map field-name="tenantId"/>
            </relation>
    </entity>
    普通實(shí)體和數(shù)據(jù)庫(kù)中的表是一一對(duì)應(yīng)的。程序會(huì)根據(jù)實(shí)體定義在數(shù)據(jù)庫(kù)中創(chuàng)建表,索引,外鍵約束等。
    2.2. 視圖實(shí)體
    <view-entity entity-name="WorkEffortAssocView"
                package-name="org.ofbiz.workeffort.workeffort"
                title="Work Effort Association Entity with Name">
          <member-entity entity-alias="WA" entity-name="WorkEffortAssoc"/>
          <member-entity entity-alias="WETO" entity-name="WorkEffort"/>
          <alias-all entity-alias="WA"/>
          <alias entity-alias="WETO" name="workEffortToName" field="workEffortName"/>
          <alias entity-alias="WETO" name="workEffortToSetup" field="estimatedSetupMillis"/>
          <alias entity-alias="WETO" name="workEffortToRun" field="estimatedMilliSeconds"/>
          <alias entity-alias="WETO" name="workEffortToParentId" field="workEffortParentId"/>
          <alias entity-alias="WETO" name="workEffortToCurrentStatusId" field="currentStatusId"/>
          <alias entity-alias="WETO" name="workEffortToWorkEffortPurposeTypeId" field="workEffortPurposeTypeId"/>
          <alias entity-alias="WETO" name="workEffortToEstimatedStartDate" field="estimatedStartDate"/>
          <alias entity-alias="WETO" name="workEffortToEstimatedCompletionDate" field="estimatedCompletionDate"/>
          <alias entity-alias="WETO" name="workEffortToActualStartDate" field="actualStartDate"/>
          <alias entity-alias="WETO" name="workEffortToActualCompletionDate" field="actualCompletionDate"/>
          <view-link entity-alias="WA" rel-entity-alias="WETO">
            <key-map field-name="workEffortIdTo" rel-field-name="workEffortId"/>
          </view-link>
          <relation type="one-nofk" fk-name="WK_EFFRTASSV_FWE" title="From" rel-entity-name="WorkEffort">
            <key-map field-name="workEffortIdFrom" rel-field-name="workEffortId"/>
          </relation>
    </view-entity>
    View entity 一般用做多表連接復(fù)雜查詢,view entity 不會(huì)在數(shù)據(jù)庫(kù)中反映出來(lái)。
    2.3. 擴(kuò)展實(shí)體
    <extend-entity entity-name="UserLogin">
            <field name="partyId" type="id"></field>
            <relation type="one" fk-name="USER_PARTY" rel-entity-name="Party">
                <key-map field-name="partyId"/>
            </relation>
            <relation type="one-nofk" rel-entity-name="Person">
                <key-map field-name="partyId"/>
            </relation>
            <relation type="one-nofk" rel-entity-name="PartyGroup">
                <key-map field-name="partyId"/>
            </relation>
    </extend-entity>
    繼承已存在的實(shí)體并對(duì)其進(jìn)行擴(kuò)展。
    2.4. 動(dòng)態(tài)實(shí)體
    DynamicViewEntity salesUsageViewEntity = new DynamicViewEntity();
                salesUsageViewEntity.addMemberEntity("OI", "OrderItem");
                salesUsageViewEntity.addMemberEntity("OH", "OrderHeader");
                salesUsageViewEntity.addMemberEntity("ItIss", "ItemIssuance");
                salesUsageViewEntity.addMemberEntity("InvIt", "InventoryItem");
                salesUsageViewEntity.addViewLink("OI", "OH", Boolean.valueOf(false), ModelKeyMap.makeKeyMapList("orderId"));
                salesUsageViewEntity.addViewLink("OI", "ItIss", Boolean.valueOf(false), ModelKeyMap.makeKeyMapList("orderId", "orderId", "orderItemSeqId", "orderItemSeqId"));
                salesUsageViewEntity.addViewLink("ItIss", "InvIt", Boolean.valueOf(false), ModelKeyMap.makeKeyMapList("inventoryItemId"));
        salesUsageViewEntity.addAlias("OI", "productId");
        salesUsageViewEntity.addAlias("OH", "statusId");
        salesUsageViewEntity.addAlias("OH", "orderTypeId");
        salesUsageViewEntity.addAlias("OH", "orderDate");
        salesUsageViewEntity.addAlias("ItIss", "inventoryItemId");
        salesUsageViewEntity.addAlias("ItIss", "quantity");
    salesUsageViewEntity.addAlias("InvIt", "facilityId");
    EntityListIterator salesUsageIt = delegator.findListIteratorByCondition(salesUsageViewEntity,
    EntityCondition.makeCondition(
    UtilMisc.toList(
             EntityCondition.makeCondition("facilityId", EntityOperator.EQUALS, facilityId),
              EntityCondition.makeCondition("productId", EntityOperator.EQUALS, productId),
                EntityCondition.makeCondition("statusId",
    EntityOperator.IN,
    UtilMisc.toList("ORDER_COMPLETED", "ORDER_APPROVED", "ORDER_HELD")),
            EntityCondition.makeCondition("orderTypeId", EntityOperator.EQUALS, "SALES_ORDER"),
               EntityCondition.makeCondition("orderDate", EntityOperator.GREATER_THAN_EQUAL_TO, checkTime)
    ),
    EntityOperator.AND),null, null, null, null
    );
    在程序中手動(dòng)創(chuàng)建實(shí)體,對(duì)其進(jìn)行查詢。
    3實(shí)體定義
    3.1. 命名規(guī)則
    實(shí)體名稱(entity-name)首字母大寫,如果實(shí)體名稱由多個(gè)關(guān)鍵字組成,那么關(guān)鍵字首字母大寫,例如entity- name="TenantDataSource",ofbiz 會(huì)在創(chuàng)建數(shù)據(jù)庫(kù)表的時(shí)候根據(jù)entity-name 實(shí)體名稱除首字母之外的大寫字母前加“_”,所以entity-name="TenantDataSource"生成的數(shù)據(jù)庫(kù)表名為 “Tenant_Data_Source”.
    所以要控制entity-name 實(shí)體名稱不要超過(guò)25個(gè)字母。
    Field 表字段,命名規(guī)則與實(shí)體名稱差不多,唯一不同的是首字母小寫。
    3.2. 實(shí)體與數(shù)據(jù)庫(kù)的關(guān)聯(lián)
        <entity-group group="org.ofbiz.olap" entity="SalesInvoiceItemFact"/>
    <entity-group group="org.ofbiz.olap" entity="SalesInvoiceItemStarSchema"/>
    Entity-group(一般定義在各個(gè)模塊的\entitydef\entitygroupXXX.xml中) 對(duì)實(shí)體進(jìn)行分組,使不同的實(shí)體分屬不同的entity-group。
    也許你會(huì)發(fā)現(xiàn)并不是每個(gè)entity都進(jìn)行了entity-group 分組。事實(shí)上如果你沒(méi)有對(duì)實(shí)體進(jìn)行分組歸類的話,系統(tǒng)啟動(dòng)的時(shí)候他會(huì)將實(shí)體默認(rèn)歸類到"org.ofbiz"中。
    查看數(shù)據(jù)庫(kù)定義文件%ofbiz_home%/framework/entity/config/entityengine.xml
    可以發(fā)現(xiàn):
    <delegator name="default" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main" distributed-cache-clear-enabled="false">
            <group-map group-name="org.ofbiz" datasource-name="localderby"/>
            <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>
            <group-map group-name="org.ofbiz.tenant" datasource-name="localderbytenant"/>
    </delegator>
    可以發(fā)現(xiàn)delegator 將多個(gè)group-name組織到一起并將group-name與 datasource-name對(duì)應(yīng)起來(lái),datasource-name又是什么?通過(guò)查看 entityengine.xml 我們可以發(fā)現(xiàn):
    <datasource name="localderby"
                helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"
                schema-name="OFBIZ"
                field-type-name="derby"
                check-on-start="true"
                add-missing-on-start="true"
                use-pk-constraint-names="false"
                use-indices-unique="false"
                alias-view-columns="false"
                use-order-by-nulls="true">
            <read-data reader-name="seed"/>
            <read-data reader-name="seed-initial"/>
            <read-data reader-name="demo"/>
            <read-data reader-name="ext"/>
            <inline-jdbc
                    jdbc-driver="org.apache.derby.jdbc.EmbeddedDriver"
                    jdbc-uri="jdbc:derby:ofbiz;create=true"
                    jdbc-username="ofbiz"
                    jdbc-password="ofbiz"
                    isolation-level="ReadCommitted"
                    pool-minsize="2"
                    pool-maxsize="250"
                    time-between-eviction-runs-millis="600000"/>
    </datasource>
    Datasource定義了數(shù)據(jù)庫(kù)驅(qū)動(dòng),數(shù)據(jù)庫(kù)用戶名、密碼等,所以datasource就是我們說(shuō)的數(shù)據(jù)庫(kù)。
    總結(jié)一下:我們通過(guò)entity-group將各個(gè)實(shí)體和數(shù)據(jù)庫(kù)之間關(guān)聯(lián)起來(lái),然后再將一個(gè)或多個(gè)數(shù)據(jù)庫(kù)歸屬到一個(gè)delegator 中,那我們又是怎么使用數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)庫(kù)操作的呢??查看每個(gè)模塊應(yīng)用底下的web.xml 我們可以發(fā)現(xiàn):
    <context-param>
            <param-name>entityDelegatorName</param-name>
            <param-value>default</param-value>
            <description>The Name of the Entity Delegator to use, defined in entityengine.xml</description>
    </context-param>
    針對(duì)不同的應(yīng)用,我們可以使用不同的delegator .如果不定義則使用default.
    在啟動(dòng)各個(gè)應(yīng)用模塊的時(shí)候,系統(tǒng)會(huì)根據(jù)web.xml 中的 entityDelegatorName
    生成delegator 對(duì)象,然后將delegator 對(duì)象存放到servletContext 中備用。
    我們就是使用這個(gè)delegator對(duì)象執(zhí)行數(shù)據(jù)庫(kù)操作,以后會(huì)介紹如何使用。
    delegator = DelegatorFactory.getDelegator(delegatorName);
        servletContext.setAttribute("delegator", delegator);


    3.3. no-auto-stamp
    no-auto-stamp="false"
    entity 屬性之一: 將此值設(shè)置為true , 則 創(chuàng)建數(shù)據(jù)庫(kù)表時(shí)將來(lái)不創(chuàng)建lastUpdatedStamp、lastUpdatedTxStamp、createdStamp、createdTxStamp
    這四個(gè)字段。
    3.4. Field.type
    <field name="tenantId" type="id-ne"/>
    Type , 將數(shù)據(jù)字段類型 與 java 類型關(guān)聯(lián)起來(lái)的設(shè)置。 定義文件路徑為:
    %ofbiz_home%\framework\entity\fieldtype\fieldtypeXXXXX.xml
    其中XXXX為你使用的數(shù)據(jù)庫(kù)名稱。
    <field-type-def type="email" sql-type="VARCHAR(255)" java-type="String"/>
    3.5. prim-key
    <prim-key field="agreementId"/>
    定義主鍵,其中field 需要是已經(jīng)被定義過(guò)的字段,即field 定義過(guò)。
    實(shí)體支持組合主鍵,即一個(gè)實(shí)體定義中可以有多個(gè)prim-key節(jié)點(diǎn)。
    如果不定義主鍵的話,數(shù)據(jù)庫(kù)是不會(huì)創(chuàng)建表的。

    3.6. relation
    relation 定義當(dāng)前實(shí)體和其他實(shí)體之間的關(guān)系,一般用做創(chuàng)建外鍵和根據(jù)關(guān)系查詢使用。
    :rel-entity-name:被關(guān)聯(lián)實(shí)體名稱。
    :fk-name:如果創(chuàng)建外鍵,那么定義外鍵的名稱。
    :title:給當(dāng)前關(guān)系起個(gè)別名。
    : field-name:當(dāng)前實(shí)體的字段,指明當(dāng)前實(shí)體的哪個(gè)字段與被關(guān)系實(shí)體有關(guān)系。
    :rel-entity-name:被關(guān)系實(shí)體名稱
    :rel-field-name:被關(guān)系的實(shí)體的字段名稱。指明field-name和被關(guān)系實(shí)體的哪個(gè)字段有關(guān)系。如果rel-field-name與field-name相同,那么rel-field-name可以不定義。
    :type="one-nofk":關(guān)聯(lián)類型,主要有三類 “one”、”one-nofk”、”many”
    很多資料上將one 解釋為 one-to-one ,將 many 解釋為 one-to-many .
    個(gè)人感覺(jué)不是很好理解,如果從數(shù)據(jù)庫(kù)方面去理解的話,one、one-nofk  的使用條件是被關(guān)系實(shí)體的rel-field-name為主鍵,而many 的使用條件是被關(guān)系實(shí)體的rel-field-name為非主鍵。而one 與 one-nofk 的區(qū)別在于one會(huì)在數(shù)據(jù)庫(kù)表結(jié)構(gòu)中創(chuàng)建外鍵約束,而one-nofk 則不會(huì)。
    Relation 除了用來(lái)創(chuàng)建外鍵約束之外還被用來(lái)做關(guān)系查詢。
    當(dāng)訪問(wèn)關(guān)系的時(shí)候可以用 .getRelated("") 或者 .getRelatedOne("") 。用 title+entityName 作為參數(shù)。
    當(dāng)實(shí)體一個(gè)"many"關(guān)系的時(shí)候使用getRelated 返回一個(gè)列表,當(dāng)實(shí)體一個(gè)"one"關(guān)系的時(shí)候使用getRelatedOne 返回一個(gè)實(shí)體對(duì)象。

    3.7. Index
    <index name="WEFF_KWD_KWD" unique="false">
                <index-field name="keyword" function="lower"/>
    </index>
    創(chuàng)建索引。
    : name:給索引起個(gè)別名。
    : unique:是否唯一索引。
    :index-field:name:對(duì)實(shí)體哪個(gè)字段創(chuàng)建索引,function待確定。
    4. 定義視圖實(shí)體
    4.1. Member-entity
    <member-entity entity-alias="EMPPOS" entity-name="EmplPosition"/>
          <member-entity entity-alias="EMPPOSFUL" entity-name="EmplPositionFulfillment"/>
    member-entity首先定義當(dāng)前視圖實(shí)體可能會(huì)用到的實(shí)體。entity-name實(shí)體名稱
    entity-alias實(shí)體別名。實(shí)體定義順序很重要,除了第一個(gè)實(shí)體之外其他都是被關(guān)聯(lián)實(shí)體。

    4.2. alias
    <alias entity-alias="EMPPOSFUL" name="partyId" field="partyId"/>
        <alias entity-alias="EMPPOSFUL" name="emplPositionId" function="count"/>
    <alias entity-alias="EMPPOSREPST" name="emplPositionIdReportingTo" group-by="true"/>

    Alias 定義當(dāng)前視圖實(shí)體中會(huì)用到的字段。entity-alias為實(shí)體別名,指當(dāng)前字段是哪個(gè)實(shí)體的,field實(shí)體字段名稱,name字段別名。 group-by依據(jù)當(dāng)前字段進(jìn)行g(shù)roup-by 分組查詢。function對(duì)當(dāng)前字段執(zhí)行function 函數(shù)處理 。
    4.3. alias-all
    <alias-all entity-alias="ODD" prefix="orderDate" group-by="true">
                <exclude field="dimensionId"/>
    </alias-all>
    alias-all 將某個(gè)實(shí)體的全部字段定義進(jìn)來(lái)。Prefix定義以規(guī)定字段字符開(kāi)頭的字段。
    Exclude 將實(shí)體中某些字段剔除出去。

    4.4. View-link
    <view-link entity-alias="SOIF" rel-entity-alias="ODD" rel-optional="false">
        <key-map field-name="orderDateDimId" rel-field-name="dimensionId"/>
       </view-link>
    視圖實(shí)體中relation 只能用來(lái)做關(guān)系查詢。
    而view-link 用來(lái)做 join 關(guān)聯(lián)查詢。在entityengine.xml中<datasource ..>元素當(dāng)中的join-style屬性當(dāng)中設(shè)置你的數(shù)據(jù)庫(kù)join語(yǔ)法。
    : rel-optional:關(guān)聯(lián)類型,默認(rèn)是內(nèi)連接,如果將此屬性值設(shè)為true ,則為外連接

    4.5. Entity-condition
    <entity-condition>
         <order-by field-name="sequenceId"/>
    </entity-condition>
    待定

    4.6. 復(fù)雜字段
    <alias entity-alias="OI" name="quantityOrdered" function="sum">
              <complex-alias operator="-">
                  <complex-alias-field entity-alias="OI" field="quantity" default-value="0"/>
                  <complex-alias-field entity-alias="OI" field="cancelQuantity" default-value="0"/>
              </complex-alias>
    </alias>
    結(jié)果為:
    Select  SUM((COALESCE(OI.QUANTITY, 0) - COALESCE(OI.CANCEL_QUANTITY, 0))) 。。。。。。
    一個(gè)缺省值是一個(gè)良好的習(xí)慣,否則當(dāng)他們之中有一個(gè)為空就會(huì)導(dǎo)致結(jié)果為空
      這個(gè)操作可以支持你使用數(shù)據(jù)庫(kù)的所有函數(shù)例如  +, -, * 和 /,字符串連接符||。
    你也可以添加一個(gè) function="" 實(shí)現(xiàn)min, max, sum, avg, count, count-distinct, upper 和 lower 在 complex-alias-field中。比如:
    <alias entity-alias="OI" >
          <complex-alias operator="-">
              <complex-alias-field entity-alias="OI" field="quantity" default-value="0" function="sum"/>
              <complex-alias-field entity-alias="OI" field="cancelQuantity" default-value="0"
    function="sum"/>
          </complex-alias>
      </alias>
    結(jié)果為SELECT (SUM(COALESCE(OI.QUANTITY,'0')) - SUM(COALESCE(OI.CANCEL_QUANTITY,'0')))
    posted on 2012-03-08 08:34 hellxoul 閱讀(1102) 評(píng)論(0)  編輯  收藏 所屬分類: OFBiz

    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 青青草国产免费久久久下载| 理论亚洲区美一区二区三区| 亚洲免费日韩无码系列 | 少妇中文字幕乱码亚洲影视| 日韩视频在线免费| 男女免费观看在线爽爽爽视频 | 中国一级特黄的片子免费 | 国产亚洲男人的天堂在线观看| 在线观看免费大黄网站| 十八禁在线观看视频播放免费| 久久久久久亚洲精品| 亚洲不卡无码av中文字幕| 日韩精品成人无码专区免费| 久操视频免费观看| 国产男女爽爽爽免费视频| 美女18毛片免费视频| 亚洲AV成人无码久久WWW| 美女视频黄免费亚洲| 亚洲乱码在线卡一卡二卡新区| 性做久久久久免费看| 18禁免费无码无遮挡不卡网站| 免费人成动漫在线播放r18 | 一级毛片a免费播放王色电影 | 亚洲精品无码久久久久sm| 免费在线观看黄网| 国产在线ts人妖免费视频| 成人性生交大片免费看无遮挡| www在线观看播放免费视频日本| 亚洲AV无码成人精品区蜜桃| 亚洲啪啪综合AV一区| 亚洲欧洲美洲无码精品VA | 亚洲熟妇自偷自拍另欧美| 亚洲卡一卡2卡三卡4麻豆| 亚洲日本在线播放| 亚洲欧洲精品一区二区三区| 亚洲人成电影福利在线播放| 久久久久亚洲精品无码系列| 亚洲AV无码成人精品区蜜桃| 亚洲综合激情六月婷婷在线观看| 亚洲国产香蕉人人爽成AV片久久| 麻豆国产精品免费视频|