转载:OFBIZ ENTITY ENGINE 菜谱,不晓得转的地方是不是原文发布地址,不贴出。感谢写菜谱的朋友。
* Keep your entity names less than 25 characters
Oracle, for example, does not like tables with names longer than 30 characters, and OFBIZ
will add a "_" between words, so it's best to keep them short.
* 保证让你的entity names在25个字符以内
因为有些数据库不允许表名超过30个字符,例如Oracle.而且ofbiz还要在单词之间加入"_",所以尽可能的让实体名称短。
* How relationships work
如何建立关系
They are defined in entitymodel.xml files for an <entity> like this:
关系是在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= defines the type of the relationship: "one" for one-to-one or "many" for
one-to-many from this entity
type=定义了一个关系类型,从这个实体看来"one" 是one-to-one 或者"many"是one-to-many
fk-name= is a foreign key name. It is usually good practice to set your own foreign key name, although OFBIZ will auto-generate if it's not there.
fk-name是一个外键名称,最佳实践策略是自己在这里定义外键名称,虽然如果这里不写OFBIZ会自动生成一个
rel-entity-name= is the name of the related entity.
rel-entity-name是被关联实体名称
title= is used to distinguish different relationships when there are many relationships between the same two entities.
title是用来在两个实体之间存在多种关系的时候用来区分不同关系的名称
<key-map> defines the fields for the relationship. field-name= is for the field of this entity to use. If the field on the related entity
has a different field name, then rel-field-name= defines the field name in the related entity. You can have many fields serve as part of a key-map.
<key-map> 为关系定义了字段
field-name是本实体用到的字段,如果在被关联实体当中使用不同的字段名,那么用rel-field-name定义被关联实体当中的字段名,一个key-map元素可以有多个字段名.
When you access a relationship, you would use .getRelated("") or .getRelatedOne("") with the title+entityName as parameter. getRelated returns a List and is appropriate when it is a "many" relation. .getRelatedOne returns a single GenericVaue and is appropriate for "one" relations.
当访问关系的时候可以用 .getRelated("") 或者 .getRelatedOne("") 用 title+entityName 作为参数。
当实体一个"many"关系的时候使用getRelated 返回一个列表,当实体一个"one"关系的时候使用getRelatedOne 返回一个GenericVaue .
* A few things about view-entities
关于view-entities的一些说明
View-entities are very powerful and allow you to create join-like queries, even when your database doesn't support joins.
view-entities是非常有用的并且允许你创建join-like查询,甚至你的数据库不支持joins都可以
The configuration of your database's join syntax is in entityengine.xml under the join-style attribute of <datasource ..>
在entityengine.xml中<datasource ..>元素当中的join-style属性当中设置你的数据库join语法
When you link two entities together using the <view-link ..> tag, remember
1. The order of the entities you name is important.
2. The default is an inner join (values must be present on both sides.) To do an outer join, use rel-optional="true"
当你将两个实体连接在一起的时候使用 <view-link ..>标签,记住
1. 实体名称的顺序很重要
2. 缺省情况时内连接(值必须在两边都出现)如果要作一个外连接用rel-optional="true"
If several entities have the same field name, such as statusId, the one from the first entity will be used and the rest tossed out. So if you need the field from one, put its <alias-all> before the others. Alternatively, use <alias ..> tag
to give the same field from different entities names, such as:
如果几个实体拥有相同名称的字段,例如statusId,那么第一个实体的statusId被使用其它的都会抛弃掉,因此如果需要使用其它实体当中相同名字字段的时候,把它们放入<alias-all>,作为一个选择用 <alias ..> 标签
可以区分不同实体当中相同的名字字段,例如:
<alias entity="EntityOne" field="statusId"/>
<alias entity="EntityTwo" field="statusId"/>
Another alternative is to use <exclude field=""> inside an <alias-all> as follows:
另一个选择就是在 <alias-all>内使用<exclude field="">例如
<alias-all entity-alias="EN">
<exclude field="fieldNameToExclude1"/>
<exclude field="fieldNameToExclude2"/>
</alias-all>
This top-down approach is more compact, which comes in handy for large tables.
这种严密的写法更加紧凑,对于字段多的大表用的上。
Alternatively, you can specify one or more <exclude field="fieldName"> inside an <alias-all>.
更加简洁的一种写法是在<alias-all>当中使用<exclude field="fieldName">
This top-down approach is more compact than specifying the alias for every field in a big
table.
这样比一个一个的指定字段的别名方法更加紧凑简洁。
If you need to do a query like this
如果你需要做一个如下查询
SELECT count(visitId) FROM ... GROUP BY trackingCodeId WHERE fromDate > ' 2005-01-01'
include field visitId with function="count", trackingCodeId with group-by="true", and
fromDate with group-by="false"
用function="count"包含字段visitId
,用group-by="true"给trackingCodeId,用fromDate给group-by="false"
Then **VERY IMPORTANT** when you do your query, such as delegator.findByCondition, you must specify the fields to select,and you must not specify the field fromDate, or you will get an error. This is why these view-entities can't be viewed from webtools.
非常非常重要的是当你查询的时候,例如使用delegator.findByCondition,你必须指定选择的字段,在上例中
不指定fromDate,你会得到一个错误,这也是为什么view-entities为什么不能在webtools里面被看到的一个原因。
For an example, look at the view entities at the bottom of
更多的例子可以参考以下实体
applications/marketing/entitydef/entitymodel.xml and
the BSH scripts in applications/marketing/webapp/marketing/WEB-INF/actions/reports.
* How to build conditions for expiration dates
怎样建立一个根据有效日期的查询条件
There is a series of very helpful methods called EntityUtil.getFilterByDateExpr which return an EntityConditionList to filter out search results by date.
有一系列非常有用的方法叫 EntityUtil.getFilterByDateExpr 能够返回EntityConditionList用于通过日期实体条件。
* How to work with large sets of data
怎样使用大量的数据
If you need to select large sets of data, you should use the EntityListIterator instead of the List. For example, if you did
如果你需要选择大量的数据集合,你可以用EntityListIterator替代List.例如如果你做了
List products = delegator.findAll("Product");
You may get yourself a "java.lang.OutOfMemoryError". This is because findAll, findByAnd, findByCondition will try to retrieve all the records into memory as a List. In that case, re-write your query to do return an EntityListIterator then loop through it. For example, this query can
be re-written as:
你可能得到一个"java.lang.OutOfMemoryError"异常。这是因为findAll, findByAnd, findByCondition尝试把所有的符合标准的纪录加载到内存当中,一个解决方案是重新写你的查询作为一个EntityListIterator并且遍历它,例如上面的查询可以写为
productsELI = delegator.findListIteratorByCondition("Product", new EntityExpr("productId",
EntityOperator.NOT_EQUAL, null), UtilMisc.toList("productId"), null);
Note that the only method for finding an EntityListIterator is a by condition, so you would have to re-write your conditions as EntityExpr (in this case, a dummy one which just says that productId is not null, which should apply to all Product entities,
since productId is a not-null primary key field) or EntityConditionList. This method also asks you to fill in the fields to select (in this case just productId) and order by (which I didn't specify with the last null.)
注意这是唯一的一个通过条件得到一个EntityListIterator的方法,你必须用EntityExpr(这个例子当中表示为 productId 不能为 null,其实是一句废话,就是说明所有纪录)或EntityConditionList者重写你的条件 。这个方法也要求指定所有要选择的字段(这个例子里面只有productId) 并且order by(在给出的例子当中没有指定,位置位于最有一个null参数)
You can pass a null EntityCondition to grab all records. However, this does not work across all databases! Beware the use of avanced functionality such as the EntityListIterator with maxdb and other odd databases.
你可以通过一个空的EntityCondition 抓取所有纪录,然而这种做法并不支持所有的数据库,对于大型数据库或者奇怪的数据库,谨慎的使用高级的函数例如EntityListIterator当中的函数。
* How to use an EntityListIterator
如何使用一个EntityListIterator
When iterating through the EntityListIterator, this is the preferred form:
当遍历EntityListIterator的时候如下的做法是首选的
while ((nextProduct = productsELI.next()) != null) {
....
// operations on nextProduct
}
Using the .hasNext() method on EntityListIterator is considered wasteful.
在EntityListIterator 当中使用.hasNext()被认为是浪费资源的
When you are done, don't forget to close it:
当你使用EntityListIterator ,不要忘记关闭它
分享到:
相关推荐
3. 更新 entityengine.xml 和 entitygroup.xml 文件:在 entityengine.xml 中添加对 entitymodel_study.xml 的引用,在 entitygroup.xml 中注册 StudyCustomer 实体。 4. 创建数据库表:运行Ofbiz的ant脚本或使用...
二、实体引擎(Entity Engine) OFBiz的实体引擎负责处理与数据库交互的事务,包括数据的读取、创建、更新和删除。它基于Java Persistence API (JPA) 和 Hibernate,提供了一种灵活的方式来定义和操作实体。通过XML...
- `entityengine.xml`:位于`c:\ofbiz\commonapp\etc`目录下,用于包含自定义的`entitymodel`文件。 - `entitygroup.xml`:同样位于`c:\ofbiz\commonapp\etc`目录下,用于管理所有的实体模型。 2. **编写XML文件*...
例如,使用EntityEngine API的`EntityQuery`和`EntityEJBQLQuery`类进行查询,`EntityCreate`、`EntityUpdate`和`EntityDelete`进行创建、更新和删除操作。这些操作通常在Service组件中定义,然后通过事件调度系统...
同时,熟悉OFBIZ的配置文件,如entityengine.xml、services.xml、component.xml等,是确保应用正确运行的关键。 此外,书中可能还会介绍OFBIZ的Web界面开发,包括使用Freemarker模板语言创建动态页面,以及如何使用...
Ofbiz不仅提供了用户认证、工作流、商务规则处理等基础组件,其核心优势还体现在EntityEngine上,这是一种高效的数据抽象层,用于简化数据库操作。 #### EntityEngine详解 EntityEngine是Ofbiz的核心技术,主要...
完成上述配置后,保存 `entityengine.xml` 文件并重启 Ofbiz 服务。现在,Ofbiz 应该使用新配置的 MySQL 数据库运行。你可以通过登录 Ofbiz 系统并检查数据存储来验证迁移是否成功。 请注意,有时候可能需要根据 ...
1. **创建(CRUD - Create)**: 在OFBiz中,创建新记录通常涉及到实体引擎(Entity Engine)的操作。开发者需要定义一个服务(service),通过这个服务调用实体引擎的API来创建新的实体实例。例如,创建一个新的CMS内容...
在 Ofbiz 中,`EntityEngine` 是一个重要的组件,它负责数据模型与数据库之间的映射。通过定义 XML 文件来描述数据库结构,Ofbiz 能够实现动态的数据表映射,从而简化了数据库操作的过程。 **2. 开发环境配置** ...
然后,你需要了解Ofbiz的配置文件,如entityengine.xml、services.xml和component.xml,它们分别定义了实体模型、服务和组件的配置。 在深入学习过程中,实践是关键。通过创建和修改简单的服务和实体,你可以逐步...
在查询方面,手册将深入讲解如何利用Ofbiz的实体引擎(Entity Engine)进行高效的数据库查询。这可能包括使用EntityFinders、实体表达式语言(EntityExprs)以及SQL查询的自定义实现。此外,手册还会涉及事务管理和...
这些模型文件通常为XML格式,比如`entityengine.xml`,它们定义了数据库表的字段、类型、约束等,并且可以通过Ofbiz的数据导入导出工具进行数据迁移和备份。开发者可以根据需要修改这些模型,以适应特定的业务需求或...
接着,你将学习Ofbiz的实体模型设计,理解如何使用Entity Engine创建和管理数据库表,以及如何编写XML文件来定义实体关系。同时,书里还会介绍如何通过Entity Manager进行数据操作,包括增删改查等基本操作。 然后...
2. 我们需要修改 Ofbiz 的配置文件(entityengine.xml),以便与 MySQL 数据库集成。 3. 我们需要在 MySQL 中创建用户和库:ofbiz、ofbizolap、ofbiztenant。 本文详细介绍了 Ofbiz 的安装与配置过程,包括环境搭建...
6. 使用文本编辑器打开C:\ofbiz\framework\entity\config下的entityengine.xml文件,这是OFBiz的实体引擎配置文件。 在这个文件中,你需要进行两项关键的修改: - 第一处修改涉及默认数据源的配置,确保OFBiz使用...