* 保持实体名称于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