﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-黑夜里的狼-随笔分类-OFBiz</title><link>http://www.blogjava.net/hellxoul/category/51021.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 08 Mar 2012 00:35:35 GMT</lastBuildDate><pubDate>Thu, 08 Mar 2012 00:35:35 GMT</pubDate><ttl>60</ttl><item><title>ofbiz之entity 实体解析</title><link>http://www.blogjava.net/hellxoul/archive/2012/03/08/371442.html</link><dc:creator>hellxoul</dc:creator><author>hellxoul</author><pubDate>Thu, 08 Mar 2012 00:34:00 GMT</pubDate><guid>http://www.blogjava.net/hellxoul/archive/2012/03/08/371442.html</guid><wfw:comment>http://www.blogjava.net/hellxoul/comments/371442.html</wfw:comment><comments>http://www.blogjava.net/hellxoul/archive/2012/03/08/371442.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellxoul/comments/commentRss/371442.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellxoul/services/trackbacks/371442.html</trackback:ping><description><![CDATA[<div>ofbiz 之entity实体 <br />1.	实体定义文件 <br />实体定义文件一般存放位置是在对应模块的entity文件夹下面,以party为例,party的实体定义文件路径为%ofbiz-home%\applications\party\entitydef\entitymodel.xml。 <br />通过对应模块的ofbiz-component.xml进行加载。 <br />&nbsp;&nbsp; &lt;entity-resource type="model" reader-name="main" loader="main" 	location="entitydef/entitymodel.xml"/&gt; <br />	&lt;entity-resource type="model" reader-name="main" loader="main" 	location="entitydef/entitymodel_old.xml"/&gt; <br />	实体定义文件可以为多个。 <br />2.	实体类型 <br />2.1.	普通实体 <br />	&lt;entity entity-name="TenantDataSource" 	package-name="org.ofbiz.entity.tenant"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;description&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; There should be one record for each tenant and each group-map 			for the active delegator. <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; The jdbc fields will override the datasource -&gt; inline-jdbc 			values for the per-tenant delegator. <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/description&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field name="tenantId" type="id-ne"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field name="entityGroupName" type="name"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field name="jdbcUri" type="long-varchar"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field name="jdbcUsername" type="long-varchar"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field name="jdbcPassword" type="long-varchar"&gt;&lt;/field&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prim-key field="tenantId"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;prim-key field="entityGroupName"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;relation type="one" fk-name="TNTDTSRC_TNT" 		rel-entity-name="Tenant"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 		&lt;key-map field-name="tenantId"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/relation&gt; <br />	&lt;/entity&gt; <br />普通实体和数据库中的表是一一对应的。程序会根据实体定义在数据库中创建表，索引，外键约束等。 <br />2.2.	视图实体 <br />&lt;view-entity entity-name="WorkEffortAssocView" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; package-name="org.ofbiz.workeffort.workeffort" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; title="Work Effort Association Entity with Name"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;member-entity entity-alias="WA" entity-name="WorkEffortAssoc"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;member-entity entity-alias="WETO" entity-name="WorkEffort"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;alias-all entity-alias="WA"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;alias entity-alias="WETO" name="workEffortToName" field="workEffortName"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;alias entity-alias="WETO" name="workEffortToSetup" field="estimatedSetupMillis"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;alias entity-alias="WETO" name="workEffortToRun" field="estimatedMilliSeconds"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;alias entity-alias="WETO" name="workEffortToParentId" field="workEffortParentId"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;alias entity-alias="WETO" name="workEffortToCurrentStatusId" field="currentStatusId"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;alias entity-alias="WETO" name="workEffortToWorkEffortPurposeTypeId" field="workEffortPurposeTypeId"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;alias entity-alias="WETO" name="workEffortToEstimatedStartDate" field="estimatedStartDate"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;alias entity-alias="WETO" name="workEffortToEstimatedCompletionDate" field="estimatedCompletionDate"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;alias entity-alias="WETO" name="workEffortToActualStartDate" field="actualStartDate"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;alias entity-alias="WETO" name="workEffortToActualCompletionDate" field="actualCompletionDate"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;view-link entity-alias="WA" rel-entity-alias="WETO"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key-map field-name="workEffortIdTo" rel-field-name="workEffortId"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/view-link&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;relation type="one-nofk" fk-name="WK_EFFRTASSV_FWE" title="From" rel-entity-name="WorkEffort"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key-map field-name="workEffortIdFrom" rel-field-name="workEffortId"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/relation&gt; <br />&lt;/view-entity&gt; <br />View entity 一般用做多表连接复杂查询，view entity 不会在数据库中反映出来。 <br />2.3.	扩展实体 <br />	&lt;extend-entity entity-name="UserLogin"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;field name="partyId" type="id"&gt;&lt;/field&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;relation type="one" fk-name="USER_PARTY" 		rel-entity-name="Party"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key-map field-name="partyId"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/relation&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;relation type="one-nofk" rel-entity-name="Person"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key-map field-name="partyId"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/relation&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;relation type="one-nofk" rel-entity-name="PartyGroup"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;key-map field-name="partyId"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/relation&gt; <br />	&lt;/extend-entity&gt; <br />	继承已存在的实体并对其进行扩展。 <br />2.4.	动态实体 <br />	DynamicViewEntity salesUsageViewEntity = new DynamicViewEntity(); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; salesUsageViewEntity.addMemberEntity("OI", "OrderItem"); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; salesUsageViewEntity.addMemberEntity("OH", "OrderHeader"); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; salesUsageViewEntity.addMemberEntity("ItIss", 		"ItemIssuance"); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; salesUsageViewEntity.addMemberEntity("InvIt", 	"InventoryItem"); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; salesUsageViewEntity.addViewLink("OI", "OH", 	Boolean.valueOf(false), ModelKeyMap.makeKeyMapList("orderId")); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; salesUsageViewEntity.addViewLink("OI", "ItIss", 	 Boolean.valueOf(false), ModelKeyMap.makeKeyMapList("orderId", 	 "orderId", "orderItemSeqId", "orderItemSeqId")); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; salesUsageViewEntity.addViewLink("ItIss", "InvIt", 	 Boolean.valueOf(false), 	ModelKeyMap.makeKeyMapList("inventoryItemId")); <br />&nbsp;&nbsp;&nbsp; salesUsageViewEntity.addAlias("OI", "productId"); <br />&nbsp;&nbsp;&nbsp; salesUsageViewEntity.addAlias("OH", "statusId"); <br />&nbsp;&nbsp;&nbsp; salesUsageViewEntity.addAlias("OH", "orderTypeId"); <br />&nbsp;&nbsp;&nbsp; salesUsageViewEntity.addAlias("OH", "orderDate"); <br />&nbsp;&nbsp;&nbsp; salesUsageViewEntity.addAlias("ItIss", "inventoryItemId"); <br />&nbsp;&nbsp;&nbsp; salesUsageViewEntity.addAlias("ItIss", "quantity"); <br />salesUsageViewEntity.addAlias("InvIt", "facilityId"); <br />	EntityListIterator salesUsageIt = 	delegator.findListIteratorByCondition(salesUsageViewEntity, <br />	EntityCondition.makeCondition( <br />		UtilMisc.toList( <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 	EntityCondition.makeCondition("facilityId", 								EntityOperator.EQUALS, facilityId), <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 	EntityCondition.makeCondition("productId", 								EntityOperator.EQUALS, productId), <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; EntityCondition.makeCondition("statusId",  <br />				EntityOperator.IN,  <br />				UtilMisc.toList("ORDER_COMPLETED", "ORDER_APPROVED", 					"ORDER_HELD")), <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 		EntityCondition.makeCondition("orderTypeId", 								EntityOperator.EQUALS, "SALES_ORDER"), <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 	EntityCondition.makeCondition("orderDate", 								EntityOperator.GREATER_THAN_EQUAL_TO, checkTime) <br />		), <br />	EntityOperator.AND),null, null, null, null <br />	); <br />在程序中手动创建实体，对其进行查询。 <br />3实体定义 <br />3.1.	命名规则 <br />实体名称（entity-name）首字母大写，如果实体名称由多个关键字组成，那么关键字首字母大写，例如entity- name="TenantDataSource"，ofbiz 会在创建数据库表的时候根据entity-name  实体名称除首字母之外的大写字母前加&#8220;_&#8221;，所以entity-name="TenantDataSource"生成的数据库表名为 &#8220;Tenant_Data_Source&#8221;. <br />所以要控制entity-name 实体名称不要超过25个字母。 <br />Field 表字段，命名规则与实体名称差不多，唯一不同的是首字母小写。 <br />3.2.	实体与数据库的关联 <br />&nbsp;&nbsp;&nbsp; &lt;entity-group group="org.ofbiz.olap" 	entity="SalesInvoiceItemFact"/&gt; <br />&lt;entity-group group="org.ofbiz.olap" 				entity="SalesInvoiceItemStarSchema"/&gt; <br />Entity-group（一般定义在各个模块的\entitydef\entitygroupXXX.xml中） 对实体进行分组，使不同的实体分属不同的entity-group。 <br />也许你会发现并不是每个entity都进行了entity-group 分组。事实上如果你没有对实体进行分组归类的话，系统启动的时候他会将实体默认归类到"org.ofbiz"中。 <br />查看数据库定义文件%ofbiz_home%/framework/entity/config/entityengine.xml <br />可以发现： <br />	&lt;delegator name="default" entity-model-reader="main" 	 entity-group-reader="main" entity-eca-reader="main" 	 distributed-cache-clear-enabled="false"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;group-map group-name="org.ofbiz" 		datasource-name="localderby"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;group-map group-name="org.ofbiz.olap" 	datasource-name="localderbyolap"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;group-map group-name="org.ofbiz.tenant" 		datasource-name="localderbytenant"/&gt; <br />&lt;/delegator&gt; <br />可以发现delegator 将多个group-name组织到一起并将group-name与	datasource-name对应起来，datasource-name又是什么？通过查看	entityengine.xml 我们可以发现： <br />	&lt;datasource name="localderby" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; helper-class="org.ofbiz.entity.datasource.GenericHelperDAO" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; schema-name="OFBIZ" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; field-type-name="derby" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; check-on-start="true" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add-missing-on-start="true" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; use-pk-constraint-names="false" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; use-indices-unique="false" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; alias-view-columns="false" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; use-order-by-nulls="true"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;read-data reader-name="seed"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;read-data reader-name="seed-initial"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;read-data reader-name="demo"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;read-data reader-name="ext"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;inline-jdbc <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jdbc-driver="org.apache.derby.jdbc.EmbeddedDriver" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jdbc-uri="jdbc:derby:ofbiz;create=true" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jdbc-username="ofbiz" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; jdbc-password="ofbiz" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; isolation-level="ReadCommitted" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool-minsize="2" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pool-maxsize="250" <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; time-between-eviction-runs-millis="600000"/&gt; <br />	&lt;/datasource&gt; <br />	Datasource定义了数据库驱动，数据库用户名、密码等，所以datasource就是我们说的数据库。  <br />总结一下：我们通过entity-group将各个实体和数据库之间关联起来，然后再将一个或多个数据库归属到一个delegator 中，那我们又是怎么使用数据库进行数据库操作的呢？？查看每个模块应用底下的web.xml 我们可以发现： <br />	&lt;context-param&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-name&gt;entityDelegatorName&lt;/param-name&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;param-value&gt;default&lt;/param-value&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;description&gt;The Name of the Entity Delegator to use, defined in 			entityengine.xml&lt;/description&gt; <br />&lt;/context-param&gt; <br />针对不同的应用，我们可以使用不同的delegator .如果不定义则使用default. <br />在启动各个应用模块的时候，系统会根据web.xml 中的 entityDelegatorName  <br />生成delegator 对象，然后将delegator 对象存放到servletContext 中备用。 <br />我们就是使用这个delegator对象执行数据库操作，以后会介绍如何使用。 <br />		delegator = DelegatorFactory.getDelegator(delegatorName); <br />&nbsp;&nbsp;&nbsp; servletContext.setAttribute("delegator", delegator); <br />	 <br /> <br />3.3.	no-auto-stamp <br />	no-auto-stamp="false" <br />entity 属性之一： 将此值设置为true ， 则 创建数据库表时将来不创建lastUpdatedStamp、lastUpdatedTxStamp、createdStamp、createdTxStamp <br />这四个字段。 <br />3.4.	Field.type <br />&lt;field name="tenantId" type="id-ne"/&gt; <br />Type , 将数据字段类型 与 java 类型关联起来的设置。 定义文件路径为： <br />%ofbiz_home%\framework\entity\fieldtype\fieldtypeXXXXX.xml <br />其中XXXX为你使用的数据库名称。 <br />	&lt;field-type-def type="email" sql-type="VARCHAR(255)" 	java-type="String"/&gt; <br />3.5.	prim-key <br /> 	&lt;prim-key field="agreementId"/&gt; <br />定义主键，其中field 需要是已经被定义过的字段，即field 定义过。 <br />实体支持组合主键，即一个实体定义中可以有多个prim-key节点。 <br />如果不定义主键的话，数据库是不会创建表的。 <br /> <br />3.6.	relation <br />relation 定义当前实体和其他实体之间的关系，一般用做创建外键和根据关系查询使用。 <br />：rel-entity-name：被关联实体名称。 <br />：fk-name：如果创建外键，那么定义外键的名称。 <br />：title：给当前关系起个别名。 <br />: field-name:当前实体的字段，指明当前实体的哪个字段与被关系实体有关系。 <br />：rel-entity-name：被关系实体名称 <br />：rel-field-name：被关系的实体的字段名称。指明field-name和被关系实体的哪个字段有关系。如果rel-field-name与field-name相同，那么rel-field-name可以不定义。 <br />：type="one-nofk"：关联类型，主要有三类 &#8220;one&#8221;、&#8221;one-nofk&#8221;、&#8221;many&#8221; <br />很多资料上将one 解释为 one-to-one ,将 many 解释为 one-to-many . <br />个人感觉不是很好理解，如果从数据库方面去理解的话，one、one-nofk&nbsp;  的使用条件是被关系实体的rel-field-name为主键，而many 的使用条件是被关系实体的rel-field-name为非主键。而one 与  one-nofk 的区别在于one会在数据库表结构中创建外键约束，而one-nofk 则不会。 <br />Relation 除了用来创建外键约束之外还被用来做关系查询。 <br />当访问关系的时候可以用 .getRelated("") 或者 .getRelatedOne("") 。用 title+entityName 作为参数。 <br />当实体一个"many"关系的时候使用getRelated 返回一个列表，当实体一个"one"关系的时候使用getRelatedOne 返回一个实体对象。 <br /> <br />3.7.	Index <br />	&lt;index name="WEFF_KWD_KWD" unique="false"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;index-field name="keyword" function="lower"/&gt; <br />&lt;/index&gt; <br />创建索引。 <br />: name:给索引起个别名。 <br />: unique:是否唯一索引。 <br />：index-field：name：对实体哪个字段创建索引，function待确定。 <br />4.	定义视图实体 <br />4.1.	Member-entity <br />	&lt;member-entity entity-alias="EMPPOS" 						entity-name="EmplPosition"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;member-entity entity-alias="EMPPOSFUL" 				entity-name="EmplPositionFulfillment"/&gt; <br />member-entity首先定义当前视图实体可能会用到的实体。entity-name实体名称 <br />entity-alias实体别名。实体定义顺序很重要，除了第一个实体之外其他都是被关联实体。 <br /> <br />4.2.	alias <br />	&lt;alias entity-alias="EMPPOSFUL" name="partyId" field="partyId"/&gt;  <br />&nbsp;&nbsp;&nbsp; &lt;alias entity-alias="EMPPOSFUL" name="emplPositionId" 	function="count"/&gt; <br />&lt;alias entity-alias="EMPPOSREPST" name="emplPositionIdReportingTo" group-by="true"/&gt;  <br /> <br />Alias  定义当前视图实体中会用到的字段。entity-alias为实体别名，指当前字段是哪个实体的，field实体字段名称，name字段别名。 group-by依据当前字段进行group-by 分组查询。function对当前字段执行function 函数处理 。 <br />4.3.	alias-all <br />	&lt;alias-all entity-alias="ODD" prefix="orderDate" group-by="true"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;exclude field="dimensionId"/&gt; <br />	&lt;/alias-all&gt; <br />	alias-all 将某个实体的全部字段定义进来。Prefix定义以规定字段字符开头的字段。 <br />	Exclude 将实体中某些字段剔除出去。 <br /> <br />4.4.	View-link <br />	&lt;view-link entity-alias="SOIF" rel-entity-alias="ODD" 		rel-optional="false"&gt; <br />&nbsp;&nbsp;&nbsp; 		&lt;key-map field-name="orderDateDimId" 		rel-field-name="dimensionId"/&gt; <br />&nbsp;&nbsp; 	&lt;/view-link&gt; <br />	视图实体中relation 只能用来做关系查询。 <br />	而view-link 用来做 join 关联查询。在entityengine.xml中&lt;datasource ..&gt;元素当中的join-style属性当中设置你的数据库join语法。 <br />	: rel-optional:关联类型，默认是内连接，如果将此属性值设为true ，则为外连接 <br /> <br />4.5.	Entity-condition <br />	&lt;entity-condition&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp; 	&lt;order-by field-name="sequenceId"/&gt; <br />&lt;/entity-condition&gt; <br />待定 <br /> <br />4.6.	复杂字段 <br />	&lt;alias entity-alias="OI" name="quantityOrdered" function="sum"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;complex-alias operator="-"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;complex-alias-field entity-alias="OI" field="quantity" 		default-value="0"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;complex-alias-field entity-alias="OI" 			field="cancelQuantity" default-value="0"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/complex-alias&gt; <br />	&lt;/alias&gt; <br />结果为： <br />Select&nbsp; SUM((COALESCE(OI.QUANTITY, 0) - COALESCE(OI.CANCEL_QUANTITY, 0))) 。。。。。。 <br />一个缺省值是一个良好的习惯，否则当他们之中有一个为空就会导致结果为空 <br />&nbsp; 这个操作可以支持你使用数据库的所有函数例如&nbsp; +, -, * 和 /，字符串连接符||。 <br />你也可以添加一个 function="" 实现min, max, sum, avg, count, count-distinct, upper 和 lower 在 complex-alias-field中。比如： <br />&lt;alias entity-alias="OI" &gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;complex-alias operator="-"&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;complex-alias-field entity-alias="OI" field="quantity" 					default-value="0" function="sum"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;complex-alias-field entity-alias="OI" 									field="cancelQuantity" default-value="0"  <br />				function="sum"/&gt; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/complex-alias&gt; <br />&nbsp; &lt;/alias&gt; <br />结果为SELECT (SUM(COALESCE(OI.QUANTITY,'0')) - SUM(COALESCE(OI.CANCEL_QUANTITY,'0'))) <br /> </div><img src ="http://www.blogjava.net/hellxoul/aggbug/371442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellxoul/" target="_blank">hellxoul</a> 2012-03-08 08:34 <a href="http://www.blogjava.net/hellxoul/archive/2012/03/08/371442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>OFBiz实体引擎开发1</title><link>http://www.blogjava.net/hellxoul/archive/2012/03/08/371441.html</link><dc:creator>hellxoul</dc:creator><author>hellxoul</author><pubDate>Thu, 08 Mar 2012 00:32:00 GMT</pubDate><guid>http://www.blogjava.net/hellxoul/archive/2012/03/08/371441.html</guid><wfw:comment>http://www.blogjava.net/hellxoul/comments/371441.html</wfw:comment><comments>http://www.blogjava.net/hellxoul/archive/2012/03/08/371441.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/hellxoul/comments/commentRss/371441.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/hellxoul/services/trackbacks/371441.html</trackback:ping><description><![CDATA[<div><div id="blog_text">* 保持实体名称少于25个字符<br /> 这个限制主要是为了Oracle只支持30字符以内的数据库对象名称,再加上OFBiz会自动在单词之间加上"_",所以就得出了这么个限制.<br /> <br /> * 关联的工作方式<br /> 它们定义于entitymodel.xml文件中的&lt;entity&gt;段，示例如下：<br /> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">relation </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="one"</span><span style="color: #ff0000"> fk-name</span><span style="color: #0000ff">="PROD_CTGRY_PARENT"</span><span style="color: #ff0000"> title</span><span style="color: #0000ff">="PrimaryParent"</span><span style="color: #ff0000"> rel-entity-name</span><span style="color: #0000ff">="ProductCategory"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /> <img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">key-map </span><span style="color: #ff0000">field-name</span><span style="color: #0000ff">="primaryParentCategoryId"</span><span style="color: #ff0000"> rel-field-name</span><span style="color: #0000ff">="productCategoryId"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /> <img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">relation</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /> <img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">relation </span><span style="color: #ff0000">type</span><span style="color: #0000ff">="many"</span><span style="color: #ff0000"> title</span><span style="color: #0000ff">="PrimaryChild"</span><span style="color: #ff0000"> rel-entity-name</span><span style="color: #0000ff">="ProductCategory"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /> <img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">key-map </span><span style="color: #ff0000">field-name</span><span style="color: #0000ff">="productCategoryId"</span><span style="color: #ff0000"> rel-field-name</span><span style="color: #0000ff">="primaryParentCategoryId"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /> <img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">relation</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /></span></div> &nbsp;&nbsp;&nbsp;&nbsp;  type这个属性标签定义关联类型: "one"表示一对一,"many"表示从此实体引出的一对多关系<br /> &nbsp;&nbsp;&nbsp;&nbsp;  fk-name的属性值是数据库外键名.为自己的外键命名是一个好的习惯,虽然如果你不设置此属性,OFiz也会自己建外建.<br /> &nbsp;&nbsp;&nbsp;&nbsp;  rel-entity-name的属性值指向关联的实体名称<br /> &nbsp;&nbsp;&nbsp;&nbsp;  title用来区分两个实体之间的多重关系<br /> &nbsp;&nbsp;&nbsp;&nbsp;  &lt;key-map&gt;节点定义关联中使用到的字段.field-name指向本实体内的引用字段,rel-field-name定义关联的实体字段,你可以通过多个字段组合关联<br /> &nbsp;&nbsp;&nbsp;&nbsp;   当你访问一个关联,你可以使用title+entityName作为参数调用.getRelated("")或.getRelatedOne("")方 法.在关联为"many"时使用.getRelated("")是恰当的,因为它返回一个List,同样在关联为"one"时通 过.getRelatedOne("")方法获得一个值.<br /> <br /> * view-entities相关内容<br /> view-entities的功能非常强大,它允许你可以创建一个join-like查询,即使你的数据库不支持join.<br /> 关于你数据库的join语法存放在entityengine.xml的datasource节点下的join-style属性中.<br /> 当你通过&lt;view-link...&gt;节点将两上实体连接起来时,记住:<br /> 1. 实体名称顺序是重要的<br /> 2. 默认的连接方式是inner join(即同样的值存在于两个实体类中),外连接需要使用rel-optional="true"<br /> 如果多个实体中拥有相同的字段名称,比如statusId,结果集中的statusId使用第一个实体中的该列,其它实体中的同名列将被丢弃.如果你想要 同时获得这些列,你需要通过在其之前加入&lt;alias-all&gt;节点,一个方式是使用&lt;alias  ..&gt;节点来为不同实体的同名字段起别名,示例:<br /> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">alias </span><span style="color: #ff0000">entity</span><span style="color: #0000ff">="EntityOne"</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">="entityOneStatusId"</span><span style="color: #ff0000"> field</span><span style="color: #0000ff">="statusId"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /> <img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff">&lt;</span><span style="color: #800000">alias </span><span style="color: #ff0000">entity</span><span style="color: #0000ff">="EntityTwo"</span><span style="color: #ff0000"> name</span><span style="color: #0000ff">="entityTwoStatusId"</span><span style="color: #ff0000"> field</span><span style="color: #0000ff">="statusId"</span><span style="color: #0000ff">/&gt;</span></div> 另一种方法是在&lt;alias-all&gt;节点中使用&lt;exclude field=""&gt;,如下:<br /> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff">&lt;</span><span style="color: #800000">alias-all </span><span style="color: #ff0000">entity-alias</span><span style="color: #0000ff">="EN"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /> <img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">exclude </span><span style="color: #ff0000">field</span><span style="color: #0000ff">="fieldNameToExclude1"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /> <img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">exclude </span><span style="color: #ff0000">field</span><span style="color: #0000ff">="fieldNameToExclude2"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /> <img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #0000ff">&lt;/</span><span style="color: #800000">alias-all</span><span style="color: #0000ff">&gt;</span></div> <br /> 这样也可以排除掉很多不打算使用到的信息,特别是在一个非常大的表中查询时.<br /> 如果你打算执行类似于以下的查询语句时:<br /> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #0000ff">SELECT</span> <span style="color: #ff00ff">count</span><span style="color: #000000">(visitId) </span><span style="color: #0000ff">FROM</span><span style="color: #000000"> <img src="../../Images/dot.gif" alt="" /> </span><span style="color: #0000ff">GROUP</span> <span style="color: #0000ff">BY</span><span style="color: #000000"> trackingCodeId </span><span style="color: #0000ff">WHERE</span><span style="color: #000000"> fromDate </span><span style="color: #808080">&gt;</span> <span style="color: #ff0000">'</span><span style="color: #ff0000">2005-01-01</span><span style="color: #ff0000">'</span></div> 需要包含字段visitId以及function="count" 标签,trackingCodeId需加上group-by="true"标签,fromDate需要加上group-by="false"标签<br /> <br /> 在你进行查询时,有一件非常重要的事情需要注意,比如说delegator.findByCondition方法,你必须指定检出的字段列表,并且你不能 指定fromDate字段,否则你将得到一个错误.这就是为webtools不能够使用view-entities来查看的原因.<br /> <br /> 你可以查看applications/marketing/entitydef/entitymodel.xml的底部内容学习,及通过 applications/marketing/webapp/marketing/WEB-INF/actions/reports学习 beanshell脚本的调用.<br /> <p>* 我可以在entitymodel.xml文件中定义自己的view-entities吗?<br /> <br /> 不能, 你可以动态定义它们.你可以查看org.ofbiz.party.party.PartyServices中的findParty方法学习它的使用</p> <p>* 如果为有效期间创建条件?<br /> <br /> 我们提供了一组非常有用的方法EntityUtil.getFilterByDateExpr ,它能返回一个EntityConditionList根据有效期间来筛选一个结果集.</p> <p>* 如何在大数据结果集下工作</p> <p>如果你检出一个大的数据结果集,你应当使用EntityListIterator通过迭代方式读取数据,而非List.<br /> 示例,如果你使用:</p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #000000">List products </span><span style="color: #000000">=</span><span style="color: #000000"> delegator.findAll(</span><span style="color: #000000">"</span><span style="color: #000000">Product</span><span style="color: #000000">"</span><span style="color: #000000">);</span></div> <p><br /> 你可能获得一个"java.lang.OutOfMemoryError". 这是由于你通过findAll, findByAnd,  findByCondition等方法来获得一个大的内存数据结果集导致内存溢出. 在这种情况下,  应该使用EntityListIterator迭代方式来读取你的数据. 这个示例应改写成:</p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #000000">productsELI </span><span style="color: #000000">=</span><span style="color: #000000"> delegator.findListIteratorByCondition(</span><span style="color: #000000">"</span><span style="color: #000000">Product</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #0000ff">new</span><span style="color: #000000"> EntityExpr(</span><span style="color: #000000">"</span><span style="color: #000000">productId</span><span style="color: #000000">"</span><span style="color: #000000">, EntityOperator.NOT_EQUAL, </span><span style="color: #0000ff">null</span><span style="color: #000000">), UtilMisc.toList(</span><span style="color: #000000">"</span><span style="color: #000000">productId</span><span style="color: #000000">"</span><span style="color: #000000">), </span><span style="color: #0000ff">null</span><span style="color: #000000">);</span></div> <p> </p> <p>注意获得EntityListIterator的方法只用通过条件, 所以你需要将你的条件重写为EntityExpr (在此次情况下,productId是主键字段不可能为空的, 所以将返回所有Proudct实例,)或 EntityConditionList.<br /> <br /> 此方法参数中包含检出的字段(这里为productId)以及排序字段(这里不需要,所以赋了null)</p> <p>你可以传递一个null作为EntityCondition参数来获得所有结果.然后这不一定在所有数据库下都能正常工作! 在maxdb及其它不常用的数据库下时你要小心使用这些高级功能.</p> <p>* 如何使用EntityListIterator</p> <p>当我们通过EntityListIterator迭代访问数据时, 通常是这样:</p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="../../Images/OutliningIndicators/ExpandedBlockStart.gif" alt="" align="top" /><span style="color: #0000ff">while</span><span style="color: #000000"> ((nextProduct </span><span style="color: #000000">=</span><span style="color: #000000"> productsELI.next()) </span><span style="color: #000000">!=</span> <span style="color: #0000ff">null</span><span style="color: #000000">) </span><span><span style="color: #000000">{<br /> <img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" /><img src="../../Images/dot.gif" alt="" />.<br /> <img src="../../Images/OutliningIndicators/InBlock.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"> operations on nextProduct</span><span style="color: #008000"><br /> <img src="../../Images/OutliningIndicators/ExpandedBlockEnd.gif" alt="" align="top" /></span><span style="color: #000000">}</span></span></div> <p><br /> 在EntityListIterator 中使用 .hasNext()方法是一种不经济的做法.</p> <p>在你完成你的操作后,要记得关闭此迭代</p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #000000">productsELI.close();</span></div> <p> </p> <p>* 如何查询无重结果集</p> <p>当前只能通过list iterator方法并指定EntityFindOptions参数,示例如下:</p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;  listIt </span><span style="color: #000000">=</span><span style="color: #000000"> delegator.findListIteratorByCondition(entityName, findConditions, <br /> <img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">, </span><span style="color: #008000">//</span><span style="color: #008000"> EntityConditions参数</span><span style="color: #008000"><br /> <img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  fieldsToSelectList, <br /> <img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  fieldsToOrderByList,&nbsp;&nbsp;<br /> <img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /> <img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000">关键部分.&nbsp;&nbsp;  第一个true表示"specifyTypeAndConcur"<br /> <img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000">//</span><span style="color: #008000"> 第二个true指完是一个滤重查询.&nbsp;&nbsp;  显然在实体引擎中只能通过这个方法来进行滤重查询</span><span style="color: #008000"><br /> <img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000"> EntityFindOptions(</span><span style="color: #0000ff">true</span><span style="color: #000000">, EntityFindOptions.TYPE_SCROLL_INSENSITIVE, EntityFindOptions.CONCUR_READ_ONLY, </span><span style="color: #0000ff">true</span><span style="color: #000000">));</span></div> <p> </p> 在minilang, 它会更简单:<br /> <p> </p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" /><span style="color: #000000">&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">entity-condition </span><span style="color: #ff0000">entity-name</span><span style="color: #0000ff">="${entityName}"</span><span style="color: #ff0000"> list-name</span><span style="color: #0000ff">="${resultList}"</span><span style="color: #ff0000"> distinct</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">&gt;</span><span style="color: #000000"><br /> <img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">&lt;</span><span style="color: #800000">select </span><span style="color: #ff0000">field</span><span style="color: #0000ff">="${fieldName}"</span><span style="color: #0000ff">/&gt;</span><span style="color: #000000"><br /> <img src="../../Images/OutliningIndicators/None.gif" alt="" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="../../Images/dot.gif" alt="" />.</span></div> <p> </p></div></div>原文：<div>http://hi.baidu.com/longer84/blog/item/dbf027cf6e58933af9dc6117.html</div><img src ="http://www.blogjava.net/hellxoul/aggbug/371441.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/hellxoul/" target="_blank">hellxoul</a> 2012-03-08 08:32 <a href="http://www.blogjava.net/hellxoul/archive/2012/03/08/371441.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>