posts - 64,comments - 22,trackbacks - 0
          * 保持實體名稱少于25個字符
          這個限制主要是為了Oracle只支持30字符以內的數據庫對象名稱,再加上OFBiz會自動在單詞之間加上"_",所以就得出了這么個限制.

          * 關聯的工作方式
          它們定義于entitymodel.xml文件中的<entity>段,示例如下:
                <relation type="one" fk-name="PROD_CTGRY_PARENT" title="PrimaryParent" rel-entity-name="ProductCategory">
                  
          <key-map field-name="primaryParentCategoryId" rel-field-name="productCategoryId"/>
                
          </relation>
                
          <relation type="many" title="PrimaryChild" rel-entity-name="ProductCategory">
                  
          <key-map field-name="productCategoryId" rel-field-name="primaryParentCategoryId"/>
                
          </relation>
               type這個屬性標簽定義關聯類型: "one"表示一對一,"many"表示從此實體引出的一對多關系
               fk-name的屬性值是數據庫外鍵名.為自己的外鍵命名是一個好的習慣,雖然如果你不設置此屬性,OFiz也會自己建外建.
               rel-entity-name的屬性值指向關聯的實體名稱
               title用來區分兩個實體之間的多重關系
               <key-map>節點定義關聯中使用到的字段.field-name指向本實體內的引用字段,rel-field-name定義關聯的實體字段,你可以通過多個字段組合關聯
               當你訪問一個關聯,你可以使用title+entityName作為參數調用.getRelated("")或.getRelatedOne("")方 法.在關聯為"many"時使用.getRelated("")是恰當的,因為它返回一個List,同樣在關聯為"one"時通 過.getRelatedOne("")方法獲得一個值.

          * view-entities相關內容
          view-entities的功能非常強大,它允許你可以創建一個join-like查詢,即使你的數據庫不支持join.
          關于你數據庫的join語法存放在entityengine.xml的datasource節點下的join-style屬性中.
          當你通過<view-link...>節點將兩上實體連接起來時,記住:
          1. 實體名稱順序是重要的
          2. 默認的連接方式是inner join(即同樣的值存在于兩個實體類中),外連接需要使用rel-optional="true"
          如果多個實體中擁有相同的字段名稱,比如statusId,結果集中的statusId使用第一個實體中的該列,其它實體中的同名列將被丟棄.如果你想要 同時獲得這些列,你需要通過在其之前加入<alias-all>節點,一個方式是使用<alias ..>節點來為不同實體的同名字段起別名,示例:
          <alias entity="EntityOne" name="entityOneStatusId" field="statusId"/>
          <alias entity="EntityTwo" name="entityTwoStatusId" field="statusId"/>
          另一種方法是在<alias-all>節點中使用<exclude field="">,如下:
          <alias-all entity-alias="EN">
            
          <exclude field="fieldNameToExclude1"/>
            
          <exclude field="fieldNameToExclude2"/>
          </alias-all>

          這樣也可以排除掉很多不打算使用到的信息,特別是在一個非常大的表中查詢時.
          如果你打算執行類似于以下的查詢語句時:
          SELECT count(visitId) FROM GROUP BY trackingCodeId WHERE fromDate > '2005-01-01'
          需要包含字段visitId以及function="count" 標簽,trackingCodeId需加上group-by="true"標簽,fromDate需要加上group-by="false"標簽

          在你進行查詢時,有一件非常重要的事情需要注意,比如說delegator.findByCondition方法,你必須指定檢出的字段列表,并且你不能 指定fromDate字段,否則你將得到一個錯誤.這就是為webtools不能夠使用view-entities來查看的原因.

          你可以查看applications/marketing/entitydef/entitymodel.xml的底部內容學習,及通過 applications/marketing/webapp/marketing/WEB-INF/actions/reports學習 beanshell腳本的調用.

          * 我可以在entitymodel.xml文件中定義自己的view-entities嗎?

          不能, 你可以動態定義它們.你可以查看org.ofbiz.party.party.PartyServices中的findParty方法學習它的使用

          * 如果為有效期間創建條件?

          我們提供了一組非常有用的方法EntityUtil.getFilterByDateExpr ,它能返回一個EntityConditionList根據有效期間來篩選一個結果集.

          * 如何在大數據結果集下工作

          如果你檢出一個大的數據結果集,你應當使用EntityListIterator通過迭代方式讀取數據,而非List.
          示例,如果你使用:

          List products = delegator.findAll("Product");


          你可能獲得一個"java.lang.OutOfMemoryError". 這是由于你通過findAll, findByAnd, findByCondition等方法來獲得一個大的內存數據結果集導致內存溢出. 在這種情況下, 應該使用EntityListIterator迭代方式來讀取你的數據. 這個示例應改寫成:

          productsELI = delegator.findListIteratorByCondition("Product", new EntityExpr("productId", EntityOperator.NOT_EQUAL, null), UtilMisc.toList("productId"), null);

          注意獲得EntityListIterator的方法只用通過條件, 所以你需要將你的條件重寫為EntityExpr (在此次情況下,productId是主鍵字段不可能為空的, 所以將返回所有Proudct實例,)或 EntityConditionList.

          此方法參數中包含檢出的字段(這里為productId)以及排序字段(這里不需要,所以賦了null)

          你可以傳遞一個null作為EntityCondition參數來獲得所有結果.然后這不一定在所有數據庫下都能正常工作! 在maxdb及其它不常用的數據庫下時你要小心使用這些高級功能.

          * 如何使用EntityListIterator

          當我們通過EntityListIterator迭代訪問數據時, 通常是這樣:

          while ((nextProduct = productsELI.next()) != null) {
          .
              
          // operations on nextProduct
          }


          在EntityListIterator 中使用 .hasNext()方法是一種不經濟的做法.

          在你完成你的操作后,要記得關閉此迭代

          productsELI.close();

          * 如何查詢無重結果集

          當前只能通過list iterator方法并指定EntityFindOptions參數,示例如下:

               listIt = delegator.findListIteratorByCondition(entityName, findConditions,
                      
          null, // EntityConditions參數
                       fieldsToSelectList,
                       fieldsToOrderByList,  
                      
                      
          //關鍵部分.   第一個true表示"specifyTypeAndConcur"
                      
          // 第二個true指完是一個濾重查詢.   顯然在實體引擎中只能通過這個方法來進行濾重查詢
                      new EntityFindOptions(true, EntityFindOptions.TYPE_SCROLL_INSENSITIVE, EntityFindOptions.CONCUR_READ_ONLY, true));

          在minilang, 它會更簡單:

            <entity-condition entity-name="${entityName}" list-name="${resultList}" distinct="true">
               
          <select field="${fieldName}"/>
               .

          原文:
          http://hi.baidu.com/longer84/blog/item/dbf027cf6e58933af9dc6117.html
          posted on 2012-03-08 08:32 hellxoul 閱讀(2268) 評論(1)  編輯  收藏 所屬分類: OFBiz

          FeedBack:
          # re: OFBiz實體引擎開發1
          2015-04-02 14:33 | 葉小謀
          <key-map>節點定義關聯中使用到的字段.field-name指向本實體內的引用字段,rel-field-name定義關聯的實體字段,你可以通過多個字段組合關聯-------多字段關聯是定義多個key-map 節點嗎?  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 邵武市| 龙江县| 铁岭县| 灵台县| 清远市| 南宁市| 大渡口区| 侯马市| 中宁县| 上杭县| 金堂县| 同仁县| 高平市| 黑河市| 奉贤区| 交城县| 库尔勒市| 长泰县| 华安县| 庐江县| 佳木斯市| 阿克苏市| 兴文县| 萝北县| 安顺市| 扎鲁特旗| 清原| 开江县| 赤城县| 奇台县| 大庆市| 嘉鱼县| 崇信县| 崇文区| 巴南区| 府谷县| 陵川县| 天津市| 天峻县| 金秀| 贵阳市|