- 浏览: 89280 次
- 性别:
- 来自: 济南
最新评论
-
成大大的:
OFBiz电商实战百度网盘下载:http://pan.baid ...
ofbiz初级--安装与配置 -
feilian09:
...
如何将org.w3c.dom.Element xml节点对象转化成XML格式的string字符串 -
我改名了:
个人感觉本文 关于 内存碎片 的说法是不准确甚至是错误的 。而 ...
java 内存溢出 -
我改名了:
我很悲剧,发个博客, 连炸 弹两个字都不让发。难道也要实行文字 ...
java 内存溢出 -
liuqiang5151:
受用了,很好的总结。
ofbiz之entity 实体解析
ofbiz 之entity实体
1. 实体定义文件
实体定义文件一般存放位置是在对应模块的entity文件夹下面,以party为例,party的实体定义文件路径为%ofbiz-home%\applications\party\entitydef\entitymodel.xml。
通过对应模块的ofbiz-component.xml进行加载。
<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"/>
实体定义文件可以为多个。
2. 实体类型
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>
普通实体和数据库中的表是一一对应的。程序会根据实体定义在数据库中创建表,索引,外键约束等。
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 不会在数据库中反映出来。
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>
继承已存在的实体并对其进行扩展。
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
);
在程序中手动创建实体,对其进行查询。
3实体定义
3.1. 命名规则
实体名称(entity-name)首字母大写,如果实体名称由多个关键字组成,那么关键字首字母大写,例如entity-name="TenantDataSource",ofbiz 会在创建数据库表的时候根据entity-name 实体名称除首字母之外的大写字母前加“_”,所以entity-name="TenantDataSource"生成的数据库表名为“Tenant_Data_Source”.
所以要控制entity-name 实体名称不要超过25个字母。
Field 表字段,命名规则与实体名称差不多,唯一不同的是首字母小写。
3.2. 实体与数据库的关联
<entity-group group="org.ofbiz.olap" entity="SalesInvoiceItemFact"/>
<entity-group group="org.ofbiz.olap" entity="SalesInvoiceItemStarSchema"/>
Entity-group(一般定义在各个模块的\entitydef\entitygroupXXX.xml中) 对实体进行分组,使不同的实体分属不同的entity-group。
也许你会发现并不是每个entity都进行了entity-group 分组。事实上如果你没有对实体进行分组归类的话,系统启动的时候他会将实体默认归类到"org.ofbiz"中。
查看数据库定义文件%ofbiz_home%/framework/entity/config/entityengine.xml
可以发现:
<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-name组织到一起并将group-name与 datasource-name对应起来,datasource-name又是什么?通过查看 entityengine.xml 我们可以发现:
<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定义了数据库驱动,数据库用户名、密码等,所以datasource就是我们说的数据库。
总结一下:我们通过entity-group将各个实体和数据库之间关联起来,然后再将一个或多个数据库归属到一个delegator 中,那我们又是怎么使用数据库进行数据库操作的呢??查看每个模块应用底下的web.xml 我们可以发现:
<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.
在启动各个应用模块的时候,系统会根据web.xml 中的 entityDelegatorName
生成delegator 对象,然后将delegator 对象存放到servletContext 中备用。
我们就是使用这个delegator对象执行数据库操作,以后会介绍如何使用。
delegator = DelegatorFactory.getDelegator(delegatorName);
servletContext.setAttribute("delegator", delegator);
3.3. no-auto-stamp
no-auto-stamp="false"
entity 属性之一: 将此值设置为true , 则 创建数据库表时将来不创建lastUpdatedStamp、lastUpdatedTxStamp、createdStamp、createdTxStamp
这四个字段。
3.4. Field.type
<field name="tenantId" type="id-ne"/>
Type , 将数据字段类型 与 java 类型关联起来的设置。 定义文件路径为:
%ofbiz_home%\framework\entity\fieldtype\fieldtypeXXXXX.xml
其中XXXX为你使用的数据库名称。
<field-type-def type="email" sql-type="VARCHAR(255)" java-type="String"/>
3.5. prim-key
<prim-key field="agreementId"/>
定义主键,其中field 需要是已经被定义过的字段,即field 定义过。
实体支持组合主键,即一个实体定义中可以有多个prim-key节点。
如果不定义主键的话,数据库是不会创建表的。
3.6. relation
relation 定义当前实体和其他实体之间的关系,一般用做创建外键和根据关系查询使用。
:rel-entity-name:被关联实体名称。
:fk-name:如果创建外键,那么定义外键的名称。
:title:给当前关系起个别名。
: field-name:当前实体的字段,指明当前实体的哪个字段与被关系实体有关系。
:rel-entity-name:被关系实体名称
:rel-field-name:被关系的实体的字段名称。指明field-name和被关系实体的哪个字段有关系。如果rel-field-name与field-name相同,那么rel-field-name可以不定义。
:type="one-nofk":关联类型,主要有三类 “one”、”one-nofk”、”many”
很多资料上将one 解释为 one-to-one ,将 many 解释为 one-to-many .
个人感觉不是很好理解,如果从数据库方面去理解的话,one、one-nofk 的使用条件是被关系实体的rel-field-name为主键,而many 的使用条件是被关系实体的rel-field-name为非主键。而one 与 one-nofk 的区别在于one会在数据库表结构中创建外键约束,而one-nofk 则不会。
Relation 除了用来创建外键约束之外还被用来做关系查询。
当访问关系的时候可以用 .getRelated("") 或者 .getRelatedOne("") 。用 title+entityName 作为参数。
当实体一个"many"关系的时候使用getRelated 返回一个列表,当实体一个"one"关系的时候使用getRelatedOne 返回一个实体对象。
3.7. Index
<index name="WEFF_KWD_KWD" unique="false">
<index-field name="keyword" function="lower"/>
</index>
创建索引。
: name:给索引起个别名。
: unique:是否唯一索引。
:index-field:name:对实体哪个字段创建索引,function待确定。
4. 定义视图实体
4.1. Member-entity
<member-entity entity-alias="EMPPOS" entity-name="EmplPosition"/>
<member-entity entity-alias="EMPPOSFUL" entity-name="EmplPositionFulfillment"/>
member-entity首先定义当前视图实体可能会用到的实体。entity-name实体名称
entity-alias实体别名。实体定义顺序很重要,除了第一个实体之外其他都是被关联实体。
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 定义当前视图实体中会用到的字段。entity-alias为实体别名,指当前字段是哪个实体的,field实体字段名称,name字段别名。group-by依据当前字段进行group-by 分组查询。function对当前字段执行function 函数处理 。
4.3. alias-all
<alias-all entity-alias="ODD" prefix="orderDate" group-by="true">
<exclude field="dimensionId"/>
</alias-all>
alias-all 将某个实体的全部字段定义进来。Prefix定义以规定字段字符开头的字段。
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 只能用来做关系查询。
而view-link 用来做 join 关联查询。在entityengine.xml中<datasource ..>元素当中的join-style属性当中设置你的数据库join语法。
: rel-optional:关联类型,默认是内连接,如果将此属性值设为true ,则为外连接
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>
结果为:
Select SUM((COALESCE(OI.QUANTITY, 0) - COALESCE(OI.CANCEL_QUANTITY, 0))) 。。。。。。
一个缺省值是一个良好的习惯,否则当他们之中有一个为空就会导致结果为空
这个操作可以支持你使用数据库的所有函数例如 +, -, * 和 /,字符串连接符||。
你也可以添加一个 function="" 实现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>
结果为SELECT (SUM(COALESCE(OI.QUANTITY,'0')) - SUM(COALESCE(OI.CANCEL_QUANTITY,'0')))
1. 实体定义文件
实体定义文件一般存放位置是在对应模块的entity文件夹下面,以party为例,party的实体定义文件路径为%ofbiz-home%\applications\party\entitydef\entitymodel.xml。
通过对应模块的ofbiz-component.xml进行加载。
<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"/>
实体定义文件可以为多个。
2. 实体类型
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>
普通实体和数据库中的表是一一对应的。程序会根据实体定义在数据库中创建表,索引,外键约束等。
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 不会在数据库中反映出来。
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>
继承已存在的实体并对其进行扩展。
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
);
在程序中手动创建实体,对其进行查询。
3实体定义
3.1. 命名规则
实体名称(entity-name)首字母大写,如果实体名称由多个关键字组成,那么关键字首字母大写,例如entity-name="TenantDataSource",ofbiz 会在创建数据库表的时候根据entity-name 实体名称除首字母之外的大写字母前加“_”,所以entity-name="TenantDataSource"生成的数据库表名为“Tenant_Data_Source”.
所以要控制entity-name 实体名称不要超过25个字母。
Field 表字段,命名规则与实体名称差不多,唯一不同的是首字母小写。
3.2. 实体与数据库的关联
<entity-group group="org.ofbiz.olap" entity="SalesInvoiceItemFact"/>
<entity-group group="org.ofbiz.olap" entity="SalesInvoiceItemStarSchema"/>
Entity-group(一般定义在各个模块的\entitydef\entitygroupXXX.xml中) 对实体进行分组,使不同的实体分属不同的entity-group。
也许你会发现并不是每个entity都进行了entity-group 分组。事实上如果你没有对实体进行分组归类的话,系统启动的时候他会将实体默认归类到"org.ofbiz"中。
查看数据库定义文件%ofbiz_home%/framework/entity/config/entityengine.xml
可以发现:
<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-name组织到一起并将group-name与 datasource-name对应起来,datasource-name又是什么?通过查看 entityengine.xml 我们可以发现:
<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定义了数据库驱动,数据库用户名、密码等,所以datasource就是我们说的数据库。
总结一下:我们通过entity-group将各个实体和数据库之间关联起来,然后再将一个或多个数据库归属到一个delegator 中,那我们又是怎么使用数据库进行数据库操作的呢??查看每个模块应用底下的web.xml 我们可以发现:
<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.
在启动各个应用模块的时候,系统会根据web.xml 中的 entityDelegatorName
生成delegator 对象,然后将delegator 对象存放到servletContext 中备用。
我们就是使用这个delegator对象执行数据库操作,以后会介绍如何使用。
delegator = DelegatorFactory.getDelegator(delegatorName);
servletContext.setAttribute("delegator", delegator);
3.3. no-auto-stamp
no-auto-stamp="false"
entity 属性之一: 将此值设置为true , 则 创建数据库表时将来不创建lastUpdatedStamp、lastUpdatedTxStamp、createdStamp、createdTxStamp
这四个字段。
3.4. Field.type
<field name="tenantId" type="id-ne"/>
Type , 将数据字段类型 与 java 类型关联起来的设置。 定义文件路径为:
%ofbiz_home%\framework\entity\fieldtype\fieldtypeXXXXX.xml
其中XXXX为你使用的数据库名称。
<field-type-def type="email" sql-type="VARCHAR(255)" java-type="String"/>
3.5. prim-key
<prim-key field="agreementId"/>
定义主键,其中field 需要是已经被定义过的字段,即field 定义过。
实体支持组合主键,即一个实体定义中可以有多个prim-key节点。
如果不定义主键的话,数据库是不会创建表的。
3.6. relation
relation 定义当前实体和其他实体之间的关系,一般用做创建外键和根据关系查询使用。
:rel-entity-name:被关联实体名称。
:fk-name:如果创建外键,那么定义外键的名称。
:title:给当前关系起个别名。
: field-name:当前实体的字段,指明当前实体的哪个字段与被关系实体有关系。
:rel-entity-name:被关系实体名称
:rel-field-name:被关系的实体的字段名称。指明field-name和被关系实体的哪个字段有关系。如果rel-field-name与field-name相同,那么rel-field-name可以不定义。
:type="one-nofk":关联类型,主要有三类 “one”、”one-nofk”、”many”
很多资料上将one 解释为 one-to-one ,将 many 解释为 one-to-many .
个人感觉不是很好理解,如果从数据库方面去理解的话,one、one-nofk 的使用条件是被关系实体的rel-field-name为主键,而many 的使用条件是被关系实体的rel-field-name为非主键。而one 与 one-nofk 的区别在于one会在数据库表结构中创建外键约束,而one-nofk 则不会。
Relation 除了用来创建外键约束之外还被用来做关系查询。
当访问关系的时候可以用 .getRelated("") 或者 .getRelatedOne("") 。用 title+entityName 作为参数。
当实体一个"many"关系的时候使用getRelated 返回一个列表,当实体一个"one"关系的时候使用getRelatedOne 返回一个实体对象。
3.7. Index
<index name="WEFF_KWD_KWD" unique="false">
<index-field name="keyword" function="lower"/>
</index>
创建索引。
: name:给索引起个别名。
: unique:是否唯一索引。
:index-field:name:对实体哪个字段创建索引,function待确定。
4. 定义视图实体
4.1. Member-entity
<member-entity entity-alias="EMPPOS" entity-name="EmplPosition"/>
<member-entity entity-alias="EMPPOSFUL" entity-name="EmplPositionFulfillment"/>
member-entity首先定义当前视图实体可能会用到的实体。entity-name实体名称
entity-alias实体别名。实体定义顺序很重要,除了第一个实体之外其他都是被关联实体。
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 定义当前视图实体中会用到的字段。entity-alias为实体别名,指当前字段是哪个实体的,field实体字段名称,name字段别名。group-by依据当前字段进行group-by 分组查询。function对当前字段执行function 函数处理 。
4.3. alias-all
<alias-all entity-alias="ODD" prefix="orderDate" group-by="true">
<exclude field="dimensionId"/>
</alias-all>
alias-all 将某个实体的全部字段定义进来。Prefix定义以规定字段字符开头的字段。
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 只能用来做关系查询。
而view-link 用来做 join 关联查询。在entityengine.xml中<datasource ..>元素当中的join-style属性当中设置你的数据库join语法。
: rel-optional:关联类型,默认是内连接,如果将此属性值设为true ,则为外连接
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>
结果为:
Select SUM((COALESCE(OI.QUANTITY, 0) - COALESCE(OI.CANCEL_QUANTITY, 0))) 。。。。。。
一个缺省值是一个良好的习惯,否则当他们之中有一个为空就会导致结果为空
这个操作可以支持你使用数据库的所有函数例如 +, -, * 和 /,字符串连接符||。
你也可以添加一个 function="" 实现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>
结果为SELECT (SUM(COALESCE(OI.QUANTITY,'0')) - SUM(COALESCE(OI.CANCEL_QUANTITY,'0')))
评论
4 楼
liuqiang5151
2013-03-27
受用了,很好的总结。
3 楼
liuruirui1986
2012-05-24
lz总结的灰常好,谢谢了,很有帮助。
2 楼
surpass_li
2011-09-25
学习了,很全面,对entity有了更进一步的了解。
1 楼
lflei
2011-08-26
看完后很受用,谢谢!
发表评论
-
转自飘飘的OFBIZ成神之路
2017-07-21 16:59 1343说在前面: 本文内容密集, 信息量超大, 请自备脑洞空间, ... -
ofbiz 事务漏洞之一
2012-11-28 23:24 582今天又仔细看了下ofbiz 服务引擎的事务 。发现了一些问题 ... -
ofbiz ant run-install 常用命令使用指南
2012-10-26 16:40 3233<!--StartFragment --> an ... -
ofibz 表达式 判断为null
2012-09-28 16:42 0String expr1 = "${flag== ... -
ofbiz 框架中表达式用法和区别
2012-08-23 15:13 1738ofbiz 中表达式的使用主要有两个类 。FlexibleS ... -
ofbiz cache 以及陷阱
2012-03-13 20:41 0设法似的大是大非 -
ofbiz11.04 eca 中 set 操作的BUG
2012-03-07 11:29 2138近日又发现了一个ofbiz 1 ... -
ofbiz之jobSandbox 调度详解
2011-09-27 16:49 0待写 : -
ofbiz 之服务 实体api 积累
2011-09-23 23:40 36971:根据delegator 获取 LocalDispatche ... -
ofbiz 之部署常见错误集锦
2011-09-27 17:05 3205本文以ofbiz 11.04 为蓝本: 1: 错误描 ... -
ofbiz之fop 中文问题
2011-09-17 19:41 0java -classpath framework\base\ ... -
ofbiz 之 jobSandbox 调度应用
2011-08-24 20:58 2546如果想在java程序中添加一条jobSandbox调度的话可以 ... -
ofbiz 之 service eca
2011-07-25 20:54 4150ofbiz 之service eca 1. 定义文件位置 ... -
ofbiz 之minilang解析
2011-07-25 20:49 9888编写一个simple method 首先我们需要对输入参数进行 ... -
ofbiz初级--安装与配置
2011-07-15 15:44 173091:ofbiz下载 1.1 svn方式下载 ...
相关推荐
4. **业务实体(Entity)管理**:学习Ofbiz的实体引擎,如何定义数据模型,创建和操作数据库表。 5. **服务(Service)开发**:理解Ofbiz的服务组件,如何编写和调用服务,实现业务逻辑。 6. **Web界面(GUI)设计...
2. **架构概述**:Ofbiz基于Service Engine、Entity Engine、Event Engine、WorkEffort Engine等核心引擎,文档可能会解析这些组件的作用及其相互关系,帮助读者理解Ofbiz的设计理念。 3. **模块详解**:Ofbiz包含...
### OFBiz框架简介及其配置文件解析 #### 一、OFBiz框架概述 OFBiz(Open For Business)是一款开源的企业级电子商务框架,它提供了一系列用于构建和管理电子商务网站的基础架构和服务。OFBiz支持多种业务功能,如...
3. **Entity Engine**:实体引擎处理数据库操作,它不依赖于ORM(对象关系映射)技术,而是采用自己的数据访问方式。这种方式可能限制了某些现代开发实践的采用,但确保了对数据库的直接控制和性能优化。 4. **...
以下是一些OFBiz中关键的XML配置文件的详细解析: 1. **entityengine.xml**: 这个文件负责配置数据源,包括数据库连接池、事务管理和字段类型的定义。`<delegator>`元素定义了不同的数据操作代理,每个代理可以...
### ofbiz开发顺序图解析 #### 一、概述 在探讨ofbiz开发顺序图之前,我们首先需要了解ofbiz的基本概念及其在企业级应用中的重要性。Apache OFBiz(Open For Business)是一款开源的企业级应用框架,用于构建复杂...
本篇文档将详细解析“OFBiz数据模型”中的关键部分,尤其是预算(Budget)相关的实体定义及其属性,帮助读者更好地理解OFBiz框架的数据存储机制。 #### 二、Budget实体定义 ##### 1. 实体概述 在OFBiz框架中,`...
`component-load.xml`是Ofbiz系统启动时读取的配置文件之一,它负责在运行时加载和初始化组件。这个文件包含了组件的配置信息,如组件名称、描述、依赖关系、服务定义、事件处理等。理解并能熟练编辑此文件对于...
### OFBiz程序结构解析 #### 一、概述 OFBiz(Open For Business)是一款开源的企业级电子商务框架,它提供了一套完整的解决方案来构建和管理复杂的业务应用。该框架基于Java语言开发,支持多种数据库,并提供了...
- 在"entitymodel_study.xml"(位于"entitydef"目录下)定义实体模型。 - 修改"entityengine.xml"以包含新定义的模型。 - 更新"entitygroup.xml",使新模型生效。 2. 启动OFBIZ,它会根据XML定义自动创建数据库...
Ofbiz的Web请求流程通常涉及以下几个步骤:接收请求、解析请求、调用服务、更新模型、渲染视图并返回响应。这一过程确保了请求处理的高效性和灵活性。 总的来说,基于Ofbiz的Web框架提供了一种强大且全面的方式来...
根据提供的部分数据模型,我们可以看到一系列实体(Entity)及其属性(Attribute)。这些实体代表了系统中的关键对象,如订单、发货单、库存项等,而属性则定义了这些对象的具体特征。 - **ShipmentContactMech** ...
【OFBIz 目录结构】的解析与详解 OFBIz,现在已经更名为OpenTaps项目,是一个专注于大规模企业级应用程序开发的开源平台。它的核心目标是构建一个全面的、企业级的电子商务解决方案,而非仅仅关注单一的工作流或...