1. 实体定义文件  实体定义文件一般存放位置是在对应模块的entity文件夹下面,以party为例,party的实体定义文件路径为 %ofbiz-home%\applications\party\entitydef\entitymodel.xml。  通过对应模块的ofbiz-component.xml进行加载。

    1. <entity-resource type="model" reader-name="main" loader="main" location="entitydef/entitymodel.xml"/>
    2. <entity-resource type="model" reader-name="main" loader="main" location="entitydef/entitymodel_old.xml"/>
  2. 实体类型
    • 普通实体

      1. <entity entity-name="TenantDataSource" package-name="org.ofbiz.entity.tenant">
      2. <description>
      3. There should be one record for each tenant and each group-map for the active delegator.
      4. The jdbc fields will override the datasource -> inline-jdbc values for the per-tenant delegator.
      5. </description>
      6. <field name="tenantId" type="id-ne"/>
      7. <field name="entityGroupName" type="name"/>
      8. <field name="jdbcUri" type="long-varchar"/>
      9. <field name="jdbcUsername" type="long-varchar"/>
      10. <field name="jdbcPassword" type="long-varchar"></field>
      11. <prim-key field="tenantId"/>
      12. <prim-key field="entityGroupName"/>
      13. <relation type="one" fk-name="TNTDTSRC_TNT" rel-entity-name="Tenant">
      14. <key-map field-name="tenantId"/>
      15. </relation>
      16. </entity>

      普通实体和数据库中的表是一一对应的。程序会根据实体定义在数据库中创建表,索引,外键约束等。

    • 视图实体 
      1. <view-entity entity-name="WorkEffortAssocView"
      2. package-name="org.ofbiz.workeffort.workeffort"
      3. title="Work Effort Association Entity with Name">
      4. <member-entity entity-alias="WA" entity-name="WorkEffortAssoc"/>
      5. <member-entity entity-alias="WETO" entity-name="WorkEffort"/>
      6. <alias-all entity-alias="WA"/>
      7. <alias entity-alias="WETO" name="workEffortToName" field="workEffortName"/>
      8. <alias entity-alias="WETO" name="workEffortToSetup" field="estimatedSetupMillis"/>
      9. <alias entity-alias="WETO" name="workEffortToRun" field="estimatedMilliSeconds"/>
      10. <alias entity-alias="WETO" name="workEffortToParentId" field="workEffortParentId"/>
      11. <alias entity-alias="WETO" name="workEffortToCurrentStatusId" field="currentStatusId"/>
      12. <alias entity-alias="WETO" name="workEffortToWorkEffortPurposeTypeId" field="workEffortPurposeTypeId"/>
      13. <alias entity-alias="WETO" name="workEffortToEstimatedStartDate" field="estimatedStartDate"/>
      14. <alias entity-alias="WETO" name="workEffortToEstimatedCompletionDate" field="estimatedCompletionDate"/>
      15. <alias entity-alias="WETO" name="workEffortToActualStartDate" field="actualStartDate"/>
      16. <alias entity-alias="WETO" name="workEffortToActualCompletionDate" field="actualCompletionDate"/>
      17. <view-link entity-alias="WA" rel-entity-alias="WETO">
      18. <key-map field-name="workEffortIdTo" rel-field-name="workEffortId"/>
      19. </view-link>
      20. <relation type="one-nofk" fk-name="WK_EFFRTASSV_FWE" title="From" rel-entity-name="WorkEffort">
      21. <key-map field-name="workEffortIdFrom" rel-field-name="workEffortId"/>
      22. </relation>
      23. </view-entity>
      1. <view-entity entity-name="FaultTransSumView" package-name="com.sunyard.cpsp.fault">
      2. <description>业务差错统计视图</description>
      3. <member-entity entity-alias="FT" entity-name="FaultTrans"></member-entity>
      4. <alias entity-alias="FT" name="faultTypeId"  group-by="true"></alias>
      5. <alias entity-alias="FT" name="createdDate"  group-by="true"></alias>
      6. <alias entity-alias="FT" name="cpspMsgId" col-alias="count" function="count"></alias>
      7. </view-entity>
      1. <datasource name="localmysql"
      2. helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"
      3. field-type-name="mysql"
      4. check-on-start="true"
      5. add-missing-on-start="true"
      6. check-pks-on-start="false"
      7. use-foreign-keys="true"
      8. join-style="ansi-no-parenthesis"
      9. alias-view-columns="false" //如果使用上面的复合函数类型(红色背景标记)  此处需要改为alias-view-columns="true"  切记!
      10. drop-fk-use-foreign-key-keyword="true"
      11. table-type="InnoDB"
      12. character-set="utf8"
      13. collate="utf8_general_ci">
      14. <read-data reader-name="seed"/>
      15. <read-data reader-name="seed-initial"/>
      16. <read-data reader-name="demo"/>
      17. <read-data reader-name="ext"/>
      18. <read-data reader-name="ext-test"/>
      19. <read-data reader-name="ext-demo"/>
      20. <inline-jdbc
      21. jdbc-driver="com.mysql.jdbc.Driver"
      22. jdbc-uri="jdbc:mysql://localhost/app_center?autoReconnect=true&characterEncoding=UTF-8"
      23. jdbc-username="root"
      24. jdbc-password="root"
      25. isolation-level="ReadCommitted"
      26. pool-minsize="2"
      27. pool-maxsize="250"
      28. time-between-eviction-runs-millis="600000"/>
      29. <!-- Please note that at least one person has experienced a problem with this value with MySQL
      30. and had to set it to -1 in order to avoid this issue.
      31. For more look at http://markmail.org/thread/5sivpykv7xkl66px and http://commons.apache.org/dbcp/configuration.html-->
      32. <!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->
      33. </datasource>

      view entity 一般用做多表连接复杂查询,view entity 不会在数据库中反映出来。

    • 扩展实体
      1. <extend-entity entity-name="UserLogin">
      2. <field name="partyId" type="id"></field>
      3. <relation type="one" fk-name="USER_PARTY" rel-entity-name="Party">
      4. <key-map field-name="partyId"/>
      5. </relation>
      6. <relation type="one-nofk" rel-entity-name="Person">
      7. <key-map field-name="partyId"/>
      8. </relation>
      9. <relation type="one-nofk" rel-entity-name="PartyGroup">
      10. <key-map field-name="partyId"/>
      11. </relation>
      12. </extend-entity>

      继承已存在的实体并对其进行扩展。

    • 动态实体 
      1. DynamicViewEntity salesUsageViewEntity = new DynamicViewEntity();
      2. salesUsageViewEntity.addMemberEntity("OI", "OrderItem");
      3. salesUsageViewEntity.addMemberEntity("OH", "OrderHeader");
      4. salesUsageViewEntity.addMemberEntity("ItIss", "ItemIssuance");
      5. salesUsageViewEntity.addMemberEntity("InvIt", "InventoryItem");
      6. salesUsageViewEntity.addViewLink("OI", "OH", Boolean.valueOf(false), ModelKeyMap.makeKeyMapList("orderId"));
      7. salesUsageViewEntity.addViewLink("OI", "ItIss", Boolean.valueOf(false), ModelKeyMap.makeKeyMapList("orderId", "orderId", "orderItemSeqId", "orderItemSeqId"));
      8. salesUsageViewEntity.addViewLink("ItIss", "InvIt", Boolean.valueOf(false), ModelKeyMap.makeKeyMapList("inventoryItemId"));
      9. salesUsageViewEntity.addAlias("OI", "productId");
      10. salesUsageViewEntity.addAlias("OH", "statusId");
      11. salesUsageViewEntity.addAlias("OH", "orderTypeId");
      12. salesUsageViewEntity.addAlias("OH", "orderDate");
      13. salesUsageViewEntity.addAlias("ItIss", "inventoryItemId");
      14. salesUsageViewEntity.addAlias("ItIss", "quantity");
      15. salesUsageViewEntity.addAlias("InvIt", "facilityId");
      16. EntityListIterator salesUsageIt = delegator.findListIteratorByCondition(
      17. salesUsageViewEntity,
      18. EntityCondition.makeCondition(
      19. UtilMisc.toList(
      20. EntityCondition.makeCondition("facilityId", EntityOperator.EQUALS, facilityId),
      21. EntityCondition.makeCondition("productId", EntityOperator.EQUALS, productId),
      22. EntityCondition.makeCondition("statusId", EntityOperator.IN,
      23. UtilMisc.toList("ORDER_COMPLETED", "ORDER_APPROVED", "ORDER_HELD")),
      24. EntityCondition.makeCondition("orderTypeId", EntityOperator.EQUALS, "SALES_ORDER"),
      25. EntityCondition.makeCondition("orderDate", EntityOperator.GREATER_THAN_EQUAL_TO, checkTime)
      26. ),
      27. EntityOperator.AND),
      28. null,
      29. null,
      30. null,
      31. null
      32. );

      在程序中手动创建实体,对其进行查询。

  3. 实体定义 
    • 命名规则  实体名称(entity-name)首字母大写,如果实体名称由多个关键字组成,那么关键字首字母大写,例如entity-name="TenantDataSource",ofbiz 会在创建数据库表的时候根据entity-name 实体名称除首字母之外的大写字母前加“_”,所以entity-name="TenantDataSource"生成的数据库表名为 “Tenant_Data_Source”.  所以要控制entity-name 实体名称不要超过25个字母。  Field 表字段,命名规则与实体名称差不多,唯一不同的是首字母小写。
    • 实体与数据库的关联 
      1. <entity-group group="org.ofbiz.olap" entity="SalesInvoiceItemFact"/>
      2. <entity-group group="org.ofbiz.olap" entity="SalesInvoiceItemStarSchema"/>

      Entity-group(一般定义在各个模块的\entitydef\entitygroupXXX.xml中) 对实体进行分组,使不同的实体分属不同的entity-group。  也许你会发现并不是每个entity都进行了entity-group 分组。事实上如果你没有对实体进行分组归类的话,系统启动的时候他会将实体默认归类到"org.ofbiz"中。  查看数据库定义文件%ofbiz_home%/framework/entity/config/entityengine.xml  可以发现:

      1. <delegator name="default"
      2. entity-model-reader="main"
      3. entity-group-reader="main"
      4. entity-eca-reader="main" >
      5. distributed-cache-clear-enabled="false">
      6. <group-map group-name="org.ofbiz" datasource-name="localderby"/>
      7. <group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>
      8. <group-map group-name="org.ofbiz.tenant" datasource-name="localderbytenant"/>
      9. </delegator>

      可以发现delegator 将多个group-name组织到一起并将group-name与datasource-name对应起来,datasource-name又是什么?通过查看 entityengine.xml 我们可以发现:

      1. <datasource name="localderby"
      2. helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"
      3. schema-name="OFBIZ"
      4. field-type-name="derby"
      5. check-on-start="true"
      6. add-missing-on-start="true"
      7. use-pk-constraint-names="false"
      8. use-indices-unique="false"
      9. alias-view-columns="false"
      10. use-order-by-nulls="true">
      11. <read-data reader-name="seed"/>
      12. <read-data reader-name="seed-initial"/>
      13. <read-data reader-name="demo"/>
      14. <read-data reader-name="ext"/>
      15. <inline-jdbc
      16. jdbc-driver="org.apache.derby.jdbc.EmbeddedDriver"
      17. jdbc-uri="jdbc:derby:ofbiz;create=true"
      18. jdbc-username="ofbiz"
      19. jdbc-password="ofbiz"
      20. isolation-level="ReadCommitted"
      21. pool-minsize="2"
      22. pool-maxsize="250"
      23. time-between-eviction-runs-millis="600000"/>
      24. </datasource>

      datasource定义了数据库驱动,数据库用户名、密码等,所以datasource就是我们说的数据库。  总结一下:我们通过entity-group将各个实体和数据库之间关联起来,然后再将一个或多个数据库归属到一个delegator 中,那我们又是怎么使用数据库进行数据库操作的呢??查看每个模块应用底下的web.xml 我们可以发现:

      1. <context-param>
      2. <param-name>entityDelegatorName</param-name>
      3. <param-value>default</param-value>
      4. <description>The Name of the Entity Delegator to use, defined in entityengine.xml</description>
      5. </context-param>

      针对不同的应用,我们可以使用不同的delegator .如果不定义则使用default.  在启动各个应用模块的时候,系统会根据web.xml 中的 entityDelegatorName 生成delegator 对象,然后将delegator 对象存放到servletContext 中备用。  我们就是使用这个delegator对象执行数据库操作,以后会介绍如何使用。

      1. delegator = DelegatorFactory.getDelegator(delegatorName);
      2. servletContext.setAttribute("delegator", delegator);
    • no-auto-stamp  no-auto-stamp="false"  entity 属性之一: 将此值设置为true , 则创建数据库表时将来不创建lastUpdatedStamp、lastUpdatedTxStamp、createdStamp、createdTxStamp 这四个字段。
    • Field.type 
      1. <field name="tenantId" type="id-ne"/>

      Type , 将数据字段类型 与 java 类型关联起来的设置。 定义文件路径为:  %ofbiz_home%\framework\entity\fieldtype\fieldtypeXXX.xml 其中XXX为你使用的数据库名称。

      1. <field-type-def type="email" sql-type="VARCHAR(255)" java-type="String"/>
    • prim-key 
      1. <prim-key field="agreementId"/>

      定义主键,其中field 需要是已经被定义过的字段,即field 定义过。  实体支持组合主键,即一个实体定义中可以有多个prim-key节点。  如果不定义主键的话,数据库是不会创建表的。

    • relation relation 定义当前实体和其他实体之间的关系,一般用做创建外键和根据关系查询使用。  :rel-entity-name:被关联实体名称。  :fk-name:如果创建外键,那么定义外键的名称。  :title:给当前关系起个别名。   : field-name:当前实体的字段,指明当前实体的哪个字段与被关系实体有关系。  :rel-entity-name:被关系实体名称  :rel-field-name:被关系的实体的字段名称。指明field-name和被关系实体的哪个字段有关系。如果rel-field-name与field-name相同,那么rel-field-name可以不定义。  :type="one-nofk":关联类型,主要有三类 “one”、”one-nofk”、”many”  很多资料上将one 解释为 one-to-one ,将 many 解释为 one-to-many .  个人感觉不是很好理解,如果从数据库方面去理解的话,one、one-nofk  的使用条件是被关系实体的rel-field-name为主键,而many 的使用条件是被关系实体的rel-field-name为非主键。而one 与 one-nofk 的区别在于one会在数据库表结构中创建外键约束,而one-nofk 则不会。  relation 除了用来创建外键约束之外还被用来做关系查询。  当访问关系的时候可以用 .getRelated("") 或者 .getRelatedOne("") 。用 title+entityName 作为参数。  当实体一个"many"关系的时候使用getRelated 返回一个列表,当实体一个"one"关系的时候使用getRelatedOne 返回一个实体对象。
    • index
      1. <index name="WEFF_KWD_KWD" unique="false">
      2. <index-field name="keyword" function="lower"/>
      3. </index>

      创建索引。 : name 给索引起个别名。 : unique 是否唯一索引。 : index-field : name 对实体哪个字段创建索引 : function 待确定。

  4. 定义视图实体 
    • member-entity

      1. <member-entity entity-alias="EMPPOS" entity-name="EmplPosition"/>
      2. <member-entity entity-alias="EMPPOSFUL" entity-name="EmplPositionFulfillment"/>

      member-entity首先定义当前视图实体可能会用到的实体。 entity-name实体名称  entity-alias实体别名。 实体定义顺序很重要,除了第一个实体之外其他都是被关联实体。

    • alias
      1. <alias entity-alias="EMPPOSFUL" name="partyId" field="partyId"/>
      2. <alias entity-alias="EMPPOSFUL" name="emplPositionId" function="count"/>
      3. <alias entity-alias="EMPPOSREPST" name="emplPositionIdReportingTo" group-by="true"/>

      alias 定义当前视图实体中会用到的字段。 entity-alias为实体别名,指当前字段是哪个实体的, field实体字段名称,name字段别名。  group-by依据当前字段进行group-by 分组查询。 function对当前字段执行function 函数处理 。

    • alias-all 
      1. <alias-all entity-alias="ODD" prefix="orderDate" group-by="true">
      2. <exclude field="dimensionId"/>
      3. </alias-all>

      alias-all 将某个实体的全部字段定义进来。Prefix定义以规定字段字符开头的字段。  exclude 将实体中某些字段剔除出去。

    • view-link 
      1. <view-link entity-alias="SOIF" rel-entity-alias="ODD" rel-optional="false">
      2. <key-map field-name="orderDateDimId" rel-field-name="dimensionId"/>
      3. </view-link>

      视图实体中relation 只能用来做关系查询。  而view-link 用来做 join 关联查询。 在entityengine.xml中<datasource ..>元素当中的join-style属性当中设置你的数据库join语法。  : rel-optional:关联类型,默认是内连接,如果将此属性值设为true ,则为外连接

    • entity-condition 
      1. <entity-condition>
      2. <order-by field-name="sequenceId"/>
      3. </entity-condition>

      待定

    • 复杂字段 
      1. <alias entity-alias="OI" name="quantityOrdered" function="sum">
      2. <complex-alias operator="-">
      3. <complex-alias-field entity-alias="OI"
      4. field="quantity"
      5. default-value="0"/>
      6. <complex-alias-field entity-alias="OI"
      7. field="cancelQuantity"
      8. default-value="0"/>
      9. </complex-alias>
      10. </alias>

      结果为:

      1. Select  SUM((COALESCE(OI.QUANTITY, 0) - COALESCE(OI.CANCEL_QUANTITY, 0)))

      一个缺省值是一个良好的习惯,否则当他们之中有一个为空就会导致结果为空  这个操作可以支持你使用数据库的所有函数例如  +, -, * 和 /,字符串连接符||。  你也可以添加一个 function="" 实现min, max, sum, avg, count, count-distinct, upper 和 lower 在 complex-alias-field中。 比如:

      1. <alias entity-alias="OI" >
      2. <complex-alias operator="-">
      3. <complex-alias-field entity-alias="OI"
      4. field="quantity"
      5. default-value="0"
      6. function="sum"/>
      7. <complex-alias-field entity-alias="OI"
      8. field="cancelQuantity"
      9. default-value="0"
      10. function="sum"/>
      11. </complex-alias>
      12. </alias>

      结果为

      1. SELECT (SUM(COALESCE(OI.QUANTITY,'0')) - SUM(COALESCE(OI.CANCEL_QUANTITY,'0')))

ofbiz之entity实体写法的更多相关文章

  1. JPA 不在 persistence.xml 文件中配置每个Entity实体类的2种解决办法

    在Spring 集成 Hibernate 的JPA方式中,需要在persistence配置文件中定义每一个实体类,这样非常地不方便,远哥目前找到了2种方法.   这2种方式都可以实现不用persist ...

  2. 简单两步快速学会使用Mybatis-Generator自动生成entity实体、dao接口和简单mapper映射(用mysql和oracle举例)

    前言: mybatis-generator是根据配置文件中我们配置的数据库连接参数自动连接到数据库并根据对应的数据库表自动的生成与之对应mapper映射(比如增删改查,选择性增删改查等等简单语句)文件 ...

  3. 简单三步快速学会使用Mybatis-Generator自动生成entity实体、dao接口以及mapper映射文件(postgre使用实例)

    前言: mybatis-generator是根据配置文件中我们配置的数据库连接参数自动连接到数据库并根据对应的数据库表自动的生成与之对应mapper映射(比如增删改查,选择性增删改查等等简单语句)文件 ...

  4. idea中Entity实体中报错:cannot resolve column/table/...解决办法。

    idea中Entity实体中报错:cannot resolve column/table/...解决办法. 若idea中Entity实体中报错: cannot resolve column.... c ...

  5. Hibernate中Entity实体类的写法

    记录下一个Entity类的写法,方便以后查阅: package com.bupt.auth.entity; import java.util.Date; import javax.persistenc ...

  6. OFBiz:添加实体栏位

    如何添加实体栏位?这里演示为PostalAddress添加planet栏位.打开applications/party/entitydef/entitymodel.xml,找到PostalAddress ...

  7. ofbiz进阶之实体引擎配置文件

    The Open For Business Project: Entity Engine Configuration Guide 原文链接:http://ofbiz.apache.org/docs/e ...

  8. .net core2.x 自动注入 Entity(实体对象到上下文)

    概要:有点老套,因为早在 .net frmework的时候(core还没出来),我们在使用 ef(4....6)的时候就已经这么用,这里我在搭建框架,所以随手写下,让后来人直接拿去用用. 1.使用前提 ...

  9. java 使用反射在dto和entity 实体类之间进行转换

    package com.example.demo.utils; import java.lang.reflect.Method; import java.util.List; import com.e ...

随机推荐

  1. java 解析http返回xml数据

    //post 请求 private static String sendPost(String url, String urlParameters) throws Exception { URL ob ...

  2. Widows与linux关于隐形文件和非隐形文件の对比

    Widows与linux关于隐形文件和非隐形文件の对比 对于windows来说 ,它本身有一些隐藏文件,为了防止一些菜鸟不小心把电脑的主要文件删除,还有就是里面存放一些你不知道的后门. 对此我们一些同 ...

  3. ACE线程管理机制-面向对象的线程类ACE_Task

    转载于:http://www.cnblogs.com/TianFang/archive/2006/12/05/583231.html 我们在前一章中使用ACE_Thread包装时,你一定已经注意到了一 ...

  4. AppWidget学习总结

    AppWidget学习总结 一.创建AppWidget.    1.在res/xml下创建一个xml文件,以设置widget占用的空间等信息.如widget_provider.xml        & ...

  5. Moodle通过CLI安装

    Moodle通过CLI安装 前提:Moodle准备工作已经完成 1) 数据库(及用户) 2) moodledata目录 3) 源代码及站点配置 安装过程 打开终端,或通过Putty或Xshell等软件 ...

  6. 安卓弹出键盘隐藏fixed定位相关的元素(obj必须是class)

    //安卓弹出键盘隐藏fixed定位相关的元素(obj必须是class) function displayFixed(obj){ var h = document.body.scrollHeight; ...

  7. [ASP.NET]从ASP.NET Postback机制,到POST/GET方法

    写这篇博客的起源来自于自己最近在学习ASP.NET时对于 PostBack机制的困惑.因为自己在解决困惑地同时,会不断产生新的疑问,因此博客最后深入到了http 包的格式和Internet所使用的TC ...

  8. 51Nod 1092 回文字符串 | 最长公共子序列变形

    求字符串和其逆的最长公共子序列,需要添加的字符数就为长度-最长公共子序列长 #include "stdio.h" #include "string.h" #de ...

  9. jQuery基本动画

    jQuery效果 一.基本效果 显示与隐藏(通过控制宽高实现) 1.show() - 显示 * 无参版本 - 不具有动画效果 * show(speed,callback)有参版本 - 具有动画效果 * ...

  10. 如何彻底关闭退出vmware虚拟机

    如何彻底关闭退出vmware虚拟机 每次使用虚拟机之后退出时,它都会在系统托盘区留下一个虚拟机图标,该如何彻底关闭退出vmware虚拟机呢? 首先我们需要运行一下虚拟机程序 1:我们如果要对虚拟机进行 ...