OFBiz实体引擎开发1

OFBiz实体引擎开发1
* 保持实体名称少于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


你可能感兴趣的:(OFBiz实体引擎开发1)