??xml version="1.0" encoding="utf-8" standalone="yes"?>97久久网站,国产精品久久中文,国产视频第一区http://www.aygfsteel.com/hellxoul/category/51021.htmlzh-cnThu, 08 Mar 2012 00:35:35 GMTThu, 08 Mar 2012 00:35:35 GMT60ofbiz之entity 实体解析http://www.aygfsteel.com/hellxoul/archive/2012/03/08/371442.htmlhellxoulhellxoulThu, 08 Mar 2012 00:34:00 GMThttp://www.aygfsteel.com/hellxoul/archive/2012/03/08/371442.htmlhttp://www.aygfsteel.com/hellxoul/comments/371442.htmlhttp://www.aygfsteel.com/hellxoul/archive/2012/03/08/371442.html#Feedback0http://www.aygfsteel.com/hellxoul/comments/commentRss/371442.htmlhttp://www.aygfsteel.com/hellxoul/services/trackbacks/371442.htmlofbiz 之entity实体
1. 实体定义文g
实体定义文g一般存放位|是在对应模块的entity文g夹下?以partyZ,party的实体定义文件\径ؓ(f)%ofbiz-home%\applications\party\entitydef\entitymodel.xml?
通过对应模块的ofbiz-component.xmlq行加蝲?
   <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"/>
实体定义文g可以为多个?
2. 实体cd
2.1. 普通实?
<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>
普通实体和数据库中的表是一一对应的。程序会(x)Ҏ(gu)实体定义在数据库中创Q烦(ch)引,外键U束{?
2.2. 视图实体
<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 一般用做多表连接复杂查询,view entity 不会(x)在数据库中反映出来?
2.3. 扩展实体
<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>
l承已存在的实体q对其进行扩展?
2.4. 动态实?
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
);
在程序中手动创徏实体Q对其进行查询?
3实体定义
3.1. 命名规则
实体名称Qentity-nameQ首字母大写Q如果实体名U由多个关键字组成,那么关键字首字母大写Q例如entity- name="TenantDataSource"Qofbiz ?x)在创徏数据库表的时候根据entity-name 实体名称除首字母之外的大写字母前?#8220;_”Q所以entity-name="TenantDataSource"生成的数据库表名?“Tenant_Data_Source”.
所以要控制entity-name 实体名称不要过25个字母?
Field 表字D,命名规则与实体名U差不多Q唯一不同的是首字母小写?
3.2. 实体与数据库的关?
    <entity-group group="org.ofbiz.olap" entity="SalesInvoiceItemFact"/>
<entity-group group="org.ofbiz.olap" entity="SalesInvoiceItemStarSchema"/>
Entity-groupQ一般定义在各个模块的\entitydef\entitygroupXXX.xml中)(j) 对实体进行分l,使不同的实体分属不同的entity-group?
也许你会(x)发现q不是每个entity都进行了(jin)entity-group 分组。事实上如果你没有对实体q行分组归类的话Q系l启动的时候他?x)将实体默认归类?org.ofbiz"中?
查看数据库定义文?ofbiz_home%/framework/entity/config/entityengine.xml
可以发现Q?
<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>
可以发现delegator 多个group-namel织C起ƈgroup-name?datasource-name对应hQdatasource-name又是什么?通过查看 entityengine.xml 我们可以发现Q?
<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定义?jin)数据库驱动Q数据库用户名、密码等Q所以datasource是我们说的数据库?
ȝ一下:(x)我们通过entity-group各个实体和数据库之间关联v来,然后再将一个或多个数据库归属到一个delegator 中,那我们又是怎么使用数据库进行数据库操作的呢Q?查看每个模块应用底下的web.xml 我们可以发现Q?
<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>
针对不同的应用,我们可以使用不同的delegator .如果不定义则使用default.
在启动各个应用模块的时候,pȝ?x)根据web.xml 中的 entityDelegatorName
生成delegator 对象Q然后将delegator 对象存放到servletContext 中备用?
我们是使用q个delegator对象执行数据库操作,以后?x)介l如何用?
delegator = DelegatorFactory.getDelegator(delegatorName);
    servletContext.setAttribute("delegator", delegator);


3.3. no-auto-stamp
no-auto-stamp="false"
entity 属性之一Q?此D|ؓ(f)true Q??创徏数据库表时将来不创徏lastUpdatedStamp、lastUpdatedTxStamp、createdStamp、createdTxStamp
q四个字Dc(din)?
3.4. Field.type
<field name="tenantId" type="id-ne"/>
Type , 数据字D늱??java cd兌h的设|?定义文g路径为:(x)
%ofbiz_home%\framework\entity\fieldtype\fieldtypeXXXXX.xml
其中XXXXZ使用的数据库名称?
<field-type-def type="email" sql-type="VARCHAR(255)" java-type="String"/>
3.5. prim-key
<prim-key field="agreementId"/>
定义主键Q其中field 需要是已经被定义过的字D,即field 定义q?
实体支持l合主键Q即一个实体定义中可以有多个prim-key节点?
如果不定义主键的话,数据库是不会(x)创徏表的?

3.6. relation
relation 定义当前实体和其他实体之间的关系Q一般用做创建外键和Ҏ(gu)关系查询使用?
Qrel-entity-nameQ被兌实体名称?
Qfk-nameQ如果创建外键,那么定义外键的名U?
QtitleQ给当前关系起个别名?
: field-name:当前实体的字D,指明当前实体的哪个字D与被关pd体有关系?
Qrel-entity-nameQ被关系实体名称
Qrel-field-nameQ被关系的实体的字段名称。指明field-name和被关系实体的哪个字D|关系。如果rel-field-name与field-name相同Q那么rel-field-name可以不定义?
Qtype="one-nofk"Q关联类型,主要有三c?“one”?#8221;one-nofk”?#8221;many”
很多资料上将one 解释?one-to-one ,?many 解释?one-to-many .
个h感觉不是很好理解Q如果从数据库方面去理解的话Qone、one-nofk  的用条件是被关pd体的rel-field-nameZ键,而many 的用条件是被关pd体的rel-field-name为非主键。而one ? one-nofk 的区别在于one?x)在数据库表l构中创建外键约束,而one-nofk 则不?x)?
Relation 除了(jin)用来创徏外键U束之外q被用来做关pL询?
当访问关pȝ时候可以用 .getRelated("") 或?.getRelatedOne("") 。用 title+entityName 作ؓ(f)参数?
当实体一?many"关系的时候用getRelated q回一个列表,当实体一?one"关系的时候用getRelatedOne q回一个实体对象?

3.7. Index
<index name="WEFF_KWD_KWD" unique="false">
            <index-field name="keyword" function="lower"/>
</index>
创徏索引?
: name:l烦(ch)引v个别名?
: unique:是否唯一索引?
Qindex-fieldQnameQ对实体哪个字段创徏索引Qfunction待确定?
4. 定义视图实体
4.1. Member-entity
<member-entity entity-alias="EMPPOS" entity-name="EmplPosition"/>
      <member-entity entity-alias="EMPPOSFUL" entity-name="EmplPositionFulfillment"/>
member-entity首先定义当前视图实体可能?x)用到的实体。entity-name实体名称
entity-alias实体别名。实体定义顺序很重要Q除?jin)第一个实体之外其他都是被兌实体?

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 定义当前视图实体中会(x)用到的字Dc(din)entity-alias为实体别名,指当前字D|哪个实体的,field实体字段名称Qname字段别名?group-by依据当前字段q行group-by 分组查询。function对当前字D|行function 函数处理 ?
4.3. alias-all
<alias-all entity-alias="ODD" prefix="orderDate" group-by="true">
            <exclude field="dimensionId"/>
</alias-all>
alias-all 某个实体的全部字段定义q来。Prefix定义以规定字D字W开头的字段?
Exclude 实体中某些字段剔除出去?

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>
视图实体中relation 只能用来做关pL询?
而view-link 用来?join 兌查询。在entityengine.xml?lt;datasource ..>元素当中的join-style属性当中设|你的数据库join语法?
: rel-optional:兌cdQ默认是内连接,如果此属性D为true Q则为外q接

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

4.6. 复杂字段
<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>
l果为:(x)
Select  SUM((COALESCE(OI.QUANTITY, 0) - COALESCE(OI.CANCEL_QUANTITY, 0))) 。。。。。?
一个缺省值是一个良好的?fn)惯Q否则当他们之中有一个ؓ(f)I就?x)导致结果?f)I?
  q个操作可以支持你用数据库的所有函C?nbsp; +, -, * ?/Q字W串q接W||?
你也可以d一?function="" 实现min, max, sum, avg, count, count-distinct, upper ?lower ?complex-alias-field中。比如:(x)
<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>
l果为SELECT (SUM(COALESCE(OI.QUANTITY,'0')) - SUM(COALESCE(OI.CANCEL_QUANTITY,'0')))


hellxoul 2012-03-08 08:34 发表评论
]]>
OFBiz实体引擎开?http://www.aygfsteel.com/hellxoul/archive/2012/03/08/371441.htmlhellxoulhellxoulThu, 08 Mar 2012 00:32:00 GMThttp://www.aygfsteel.com/hellxoul/archive/2012/03/08/371441.htmlhttp://www.aygfsteel.com/hellxoul/comments/371441.htmlhttp://www.aygfsteel.com/hellxoul/archive/2012/03/08/371441.html#Feedback0http://www.aygfsteel.com/hellxoul/comments/commentRss/371441.htmlhttp://www.aygfsteel.com/hellxoul/services/trackbacks/371441.html
* 保持实体名称于25个字W?br /> q个限制主要是ؓ(f)?jin)Oracle只支?0字符以内的数据库对象名称,再加上OFBiz?x)自动在单词之间加?_",所以就得出?jin)这么个限?

* 兌的工作方?br /> 它们定义于entitymodel.xml文g中的<entity>D,CZ如下Q?br />
      <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>
     typeq个属性标{֮义关联类? "one"表示一对一,"many"表示从此实体引出的一对多关系
     fk-name的属性值是数据库外键名.q外键命名是一个好的习(fn)?虽然如果你不讄此属?OFiz也会(x)自己建外?
     rel-entity-name的属性值指向关联的实体名称
     title用来区分两个实体之间的多重关p?br />      <key-map>节点定义兌中用到的字D?field-name指向本实体内的引用字D?rel-field-name定义兌的实体字D?你可以通过多个字段l合兌
     当你讉K一个关?你可以用title+entityName作ؓ(f)参数调用.getRelated("")?getRelatedOne("")??在关联ؓ(f)"many"时?getRelated("")是恰当的,因ؓ(f)它返回一个List,同样在关联ؓ(f)"one"旉?q?getRelatedOne("")Ҏ(gu)获得一个?

* view-entities相关内容
view-entities的功能非常强?它允怽可以创徏一个join-like查询,即你的数据库不支持join.
关于你数据库的join语法存放在entityengine.xml的datasource节点下的join-style属性中.
当你通过<view-link...>节点两上实体连接v来时,C:
1. 实体名称序是重要的
2. 默认的连接方式是inner join(卛_L(fng)值存在于两个实体cM),外连接需要用rel-optional="true"
如果多个实体中拥有相同的字段名称,比如statusId,l果集中的statusId使用W一个实体中的该?其它实体中的同名列将被丢?如果你想?同时获得q些?你需要通过在其之前加入<alias-all>节点,一个方式是使用<alias ..>节点来ؓ(f)不同实体的同名字Dv别名,CZ:
<alias entity="EntityOne" name="entityOneStatusId" field="statusId"/>
<alias entity="EntityTwo" name="entityTwoStatusId" field="statusId"/>
另一U方法是?lt;alias-all>节点中?lt;exclude field="">,如下:
<alias-all entity-alias="EN">
  
<exclude field="fieldNameToExclude1"/>
  
<exclude field="fieldNameToExclude2"/>
</alias-all>

q样也可以排除掉很多不打用到的信?特别是在一个非常大的表中查询时.
如果你打执行类g以下的查询语句时:
SELECT count(visitId) FROM GROUP BY trackingCodeId WHERE fromDate > '2005-01-01'
需要包含字DvisitId以及(qing)function="count" 标签,trackingCodeId需加上group-by="true"标签,fromDate需要加上group-by="false"标签

在你q行查询?有一仉帔R要的事情需要注?比如说delegator.findByConditionҎ(gu),你必L定检出的字段列表,q且你不?指定fromDate字段,否则你将得到一个错?q就是ؓ(f)webtools不能够用view-entities来查看的原因.

你可以查看applications/marketing/entitydef/entitymodel.xml的底部内容学??qing)通过 applications/marketing/webapp/marketing/WEB-INF/actions/reports学习(fn) beanshell脚本的调?

* 我可以在entitymodel.xml文g中定义自qview-entities?

不能, 你可以动态定义它?你可以查看org.ofbiz.party.party.PartyServices中的findPartyҎ(gu)学习(fn)它的使用

* 如果为有效期间创建条?

我们提供?jin)一l非常有用的Ҏ(gu)EntityUtil.getFilterByDateExpr ,它能q回一个EntityConditionListҎ(gu)有效期间来筛选一个结果集.

* 如何在大数据l果集下工作

如果你检Z个大的数据结果集,你应当用EntityListIterator通过q代方式d数据,而非List.
CZ,如果你?

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


你可能获得一?java.lang.OutOfMemoryError". q是׃你通过findAll, findByAnd, findByCondition{方法来获得一个大的内存数据结果集D内存溢出. 在这U情况下, 应该使用EntityListIteratorq代方式来读取你的数? q个CZ应改写成:

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

注意获得EntityListIterator的方法只用通过条g, 所以你需要将你的条g重写为EntityExpr (在此ơ情况下,productId是主键字D不可能为空? 所以将q回所有Proudct实例,)?EntityConditionList.

此方法参C包含(g)出的字段(q里为productId)以及(qing)排序字段(q里不需?所以赋?jin)null)

你可以传递一个null作ؓ(f)EntityCondition参数来获得所有结?然后q不一定在所有数据库下都能正常工? 在maxdb?qing)其它不常用的数据库下时你要?j)使用q些高功能.

* 如何使用EntityListIterator

当我们通过EntityListIteratorq代讉K数据? 通常是这?

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


在EntityListIterator 中?.hasNext()Ҏ(gu)是一U不l济的做?

在你完成你的操作?要记得关闭此q代

productsELI.close();

* 如何查询无重l果?/p>

当前只能通过list iteratorҎ(gu)q指定EntityFindOptions参数,CZ如下:

     listIt = delegator.findListIteratorByCondition(entityName, findConditions,
            
null, // EntityConditions参数
             fieldsToSelectList,
             fieldsToOrderByList,  
            
            
//关键部分.   W一个true表示"specifyTypeAndConcur"
            
// W二个true指完是一个o(h)重查?   昄在实体引擎中只能通过q个Ҏ(gu)来进行o(h)重查?/span>
            new EntityFindOptions(true, EntityFindOptions.TYPE_SCROLL_INSENSITIVE, EntityFindOptions.CONCUR_READ_ONLY, true));

在minilang, 它会(x)更简?

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

原文Q?div>http://hi.baidu.com/longer84/blog/item/dbf027cf6e58933af9dc6117.html

hellxoul 2012-03-08 08:32 发表评论
]]>
վ֩ģ壺 | | | ֹ| | ¯| | | | | | | | ذ| | | | | | | | ˿| ݶ| | | ԭ| | | | | ˷| | ǿ| Ϫ| | ۰| | | | ͤ| ̨|