OFBiz实体引擎开发烹调书 (一)
* 保持实体名称少于25个字符
这个限制主要是为了Oracle只支持30字符以内的数据库对象名称,再加上OFBiz会自动在单词之间加上"_",所以就得出了这么个限制.
* 关联的工作方式
它们定义于entitymodel.xml文件中的<entity>段,示例如下:
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 ..>节点来为不同实体的同名字段起别名,示例:
这样也可以排除掉很多不打算使用到的信息,特别是在一个非常大的表中查询时.
如果你打算执行类似于以下的查询语句时:
在你进行查询时,有一件非常重要的事情需要注意,比如说delegator.findByCondition方法,你必须指定检出的字段列表,并且你不能指定fromDate字段,否则你将得到一个错误.这就是为webtools不能够使用view-entities来查看的原因.
你可以查看applications/marketing/entitydef/entitymodel.xml的底部内容学习,及通过applications/marketing/webapp/marketing/WEB-INF/actions/reports学习beanshell脚本的调用.
未完待续>>
本文档译自ofbiz 4.0 cookbooks,本人翻译,欢迎转载,请注明出处.
这个限制主要是为了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"表示从此实体引出的一对多关系
< 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 >
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 entity ="EntityTwo" name ="entityTwoStatusId" field ="statusId" />
<
alias-all
entity-alias
="EN"
>
< exclude field ="fieldNameToExclude1" />
< exclude field ="fieldNameToExclude2" />
</ alias-all >
< 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脚本的调用.
未完待续>>
本文档译自ofbiz 4.0 cookbooks,本人翻译,欢迎转载,请注明出处.