1. 背景
实体引擎是一组工具和模式(patterns)的集合,用来建模和管理实体数据。在本文中,实体是由一组字段(field)、以及与其他各种实体之间的关系(relation)所构成的数据片段。此定义来自于关系数据库管理系统的标准实体-关系建模观点。实体引擎的目标是简化实体数据的企业级运用。它包含了定义、维护、质量保证、以及实体相关功能的开发等
2. OFBiz之Entity简介
1. Entity Engine屏蔽了数据库访问的很多细节,通过XML配置文件定义描述实体,实体引擎自动维护实体至数据库的所有细节
2. 支持主流数据库,包括Oracle、MySql、MS SQL、PostgreSql等
3. OFBiz实体引擎与其他的ORM框架最大的不同,是OFBiz只有一个GenericValue对象,不像其它ORM框架,要定义各种不同类型的,防止产生过多的实体对象,避免产生类爆炸。
4. OFBiz的GenericValue对象不同于其它ORM框架定义的实体对象,它没有getter和setter方法,全部通过put(key,value)的形式来设置属性的值,保持最大的灵活性
3. OFBiz实体配置
3.1 实体对应数据系统配置
通过一个简单的XML文件entityengine.xml来配置实体引擎。该文件必须位于classpath某处。这个文件用来定义维持服务需要的参数,比如EJB服务参数、JDBC服务参数。他也用来指定使用那个实体模型、实体组及服务用到的字段类型模型文件,OFBiz发版默认的配置文件:..\ofbiz\framework\entity\config\entityengine.xml
3.2 实体代理(EntityDelegators)
delegator标签必须包含一个或多个group-map
标签来为delegator从实体引擎加载器知道每组实体指定一个数据源。delegator使用这个文件为所有实体分组。当对一个实体的操作发生时,delegator会查找实体组及和实体组通信的数据源帮助类来执行低层数据源操作。采用这种技术实现应用程序,就不需要知道对给定的实体由哪个帮助类负责访问,由此可以实现使用一个简单的配置将一个实体或很多组实体指派给不同的数据源
属性名 | 需要? | 描述 |
name | Y | Delegator名称,使用这个名称用来查找这个标签。 |
entity-model-reader | Y | delegator使用的entity-model-reader名称。 |
entity-group-reader | Y | delegator使用的entity-group-reader名称。 |
<delegator name="default"entity-model-reader="main" entity-group-reader="main"entity-eca-reader="main" distributed-cache-clear-enabled="false">
<group-map group-name="org.ofbiz" datasource-name="localmssql"/>
<group-map group-name="org.ofbiz.olap" datasource-name="localderbyolap"/>
<group-map group-name="org.ofbiz.tenant" datasource-name="localderbytenant"/>
</delegator>
3.3 数据源(datasource)
一个数据源通过作为默认的RDBMS(关系型数据库管理系统),在一个数据库实例中可以有多种数据库模式,每一种数据库模式具有不同的实体数据源通常被定义和配置.
属性名 | 需要 | 描述 |
name | Y | 数据源的名字 |
helper-class | Y | 可能有许多类型的数据源帮助类,主要的一个是JDBC/DAO帮助类。可以实现 |
field-type-name | Y | 要使用的字段类型的名字。必须和前面field-type标签定义的字段类型名字匹配。 |
check-on-start | N | 启动时是否检查数据源?必须为true或false,默认为true。 |
add-missing-on-start | N | 当启动时检查数据源时,是否要添加不存在的实体?必须为true或false,默认为false。 |
use-foreign-keys | N | 对"one"类型的关系,是否使用/创建外键?必须为true或false,默认为true。 |
use-foreign-key-indices | N | 是否对外键使用/创建索引(也就是外键上的索引)?注意到这个属性起作用并不需要创建外键,索引只为定义为"one"类型的关系创建。必须为true或false,默认为true。 |
check-fks-on-start | N | 启动时是否检查外键,当需要时是否添加?必须为true或false,默认为false。有些数据库会花费很长时间,并且不会返回所有外键列表,结果导致重复的外键会添加到数据库中。 |
check-fk-indices-on-start | N | 启动时是否检查外键索引,当需要时是否添加?必须为true或false,默认为false。 |
use-pk-constraint-names | N | 是否为主键使用约束名字?有些数据库对此有问题,但是如果给个名字就回工作正常。必须为true或false,默认为true。 |
constraint-name-clip-length | N | 指定约束名的最大长度。超出的将被裁掉。这样做时当心重复的约束名。必须为整数,默认为30。 |
fk-style | N | 指定外键语法(syntax)类型:命名为外键约束或仅仅外键。大多数数据库使用name_constraint语法,但是SAPDB这样做会出现异常,可能还有其他数据库也会这样。必须为"name_constraint"或"name_fk",默认为"name_constraint"。 |
use-fk-initially-deferred | N | 指定在许多数据库中,当创建外键时使用INITIALLYDEFERRED选项是否可用。不是所有数据库都支持这个选项。当可用且数据库支持时,外键检查只有在事务提交时才会进行,这和在事务中检查外键恰恰相反。必须为true或false,默认为true。 |
join-style | N | 指定当在view-entity操作中做表联接时使用的语法。许多数据库采用标准的ANSIJOIN,但是在此之前theta联接更通用。支持两个theta连接类型:Oracle和MSSQL。必须为"ansi","theta-oracle"或"theta-mssql"。默认为"ansi"。 |
<datasource name="localmssql"
helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"
schema-name="OFBIZ"
field-type-name="mssql"
check-on-start="true"
add-missing-on-start="true"
use-pk-constraint-names="false"
use-indices-unique="false"
alias-view-columns="false"
use-order-by-nulls="true" >
<!--offset-style="fetch"-->
<read-data reader-name="tenant"/>
<read-data reader-name="seed"/>
<read-data reader-name="seed-initial"/>
<read-data reader-name="demo"/>
<read-data reader-name="ext"/>
<read-data reader-name="ext-test"/>
<read-data reader-name="ext-demo"/>
<!-- bewareuse-indices-unique="false" is needed because of Derby bug with nullvalues in a unique index -->
<inline-jdbc
jdbc-driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"
jdbc-uri="jdbc:sqlserver://localhost:1433;databaseName=ofbiz;SelectMethod=cursor;"
jdbc-username="sa"
jdbc-password="solex"
isolation-level="ReadCommitted"
pool-minsize="2"
pool-maxsize="250"
time-between-eviction-runs-millis="600000"/>
<!-- <jndi-jdbcjndi-server-name="localjndi"jndi-name="java:/DerbyDataSource"isolation-level="ReadCommitted"/> -->
</datasource>
Inline-jdbc
标签有如下属性:
属性名 | 需要? | 描述 |
jdbc-driver | Y | 数据库JDBC驱动程序类。 |
jdbc-uri | Y | 用来指定数据库的类型和位置的URI。 |
jdbc-username | Y | 连接数据库用的用户名。 |
jdbc-password | Y | 用户名的密码。 |
isolation-level | N | 用来指定Tyrex事物隔离级别(isolationlevel),标准JDBC事务隔离级别有: 'ReadCommitted' 'ReadUncommitted' 'RepeatableRead' 'Serializable'(default) |
3.4 数据字段类型XML文件
field-type标签用来配置每个指定的字段类型。标签的name属性用来指名字段类型的名字。实体组加载器使用一个单独的XML文件来获取字段类型信息。
这个标签有两个需要的属性:loader用来指定使用哪个资源加载器,location指定了资源加载器内部加载资源使用的位置。SQL SERVER : \ofbiz\framework\entity\fieldtype\fieldtypemssql.xml
<resource-loader name="fieldfile"class="org.ofbiz.base.config.FileLoader"
prepend-env="ofbiz.home"prefix="/framework/entity/fieldtype/"/>
具体对应不同的数据类型:
<field-type name="hsql" loader="fieldfile"location="fieldtypehsql.xml"/>
<field-type name="derby" loader="fieldfile"location="fieldtypederby.xml"/>
<field-type name="daffodil" loader="fieldfile"location="fieldtypedaffodil.xml"/>
<field-type name="axion" loader="fieldfile"location="fieldtypeaxion.xml"/>
<field-type name="mysql" loader="fieldfile"location="fieldtypemysql.xml"/>
<field-type name="postgres" loader="fieldfile"location="fieldtypepostgres.xml"/>
<field-type name="postnew" loader="fieldfile"location="fieldtypepostnew.xml"/>
<field-type name="oracle" loader="fieldfile"location="fieldtypeoracle.xml"/>
<field-type name="sapdb" loader="fieldfile"location="fieldtypesapdb.xml"/>
<field-type name="sybase" loader="fieldfile"location="fieldtypesybase.xml"/>
<field-type name="firebird" loader="fieldfile"location="fieldtypefirebird.xml"/>
<field-type name="mssql" loader="fieldfile"location="fieldtypemssql.xml"/>
<field-type name="advantage" loader="fieldfile"location="fieldtypeadvantage.xml"/>
4. OFBiz实体应用
ofbiz实体引擎是管理实体和实体数据的一系列工具和模式。在这里实体是指用field(字段)和relation(与其他实体的关系)定义的一组数据。实体定义依据标准RDBMS(关系数据库管理系统)中的Entity-Relation模型来建立。实体引擎的目标是简化实体数据的使用,包括实体的定义、维护、优化、及和实体有关的功能。
4.1 ofbiz数据访问对象获取
在ofbiz中对实体的访问(数据库)是通过delegate对象来进行的,而delegate对象是GenericDelegator类的一个实例,他包含有关实体操作的方法和属性。
n delegator对象的获取
在JSP中使用
<jsp:useBeanid="delegator"type="org.ofbiz.core.entity.GenericDelegator"scope="request"/>
在severlet或event中使用
GenericDelegatordelegator=(GenericDelegator)request.getAttribute("delegator");
通过一个已知的数值对象获取delegator,方法为
GenericDelegator delegator=userLogin.getDelegator();
手工建立
GenericDelegator delegator=GenericDelegator.getGenericDelegator("default")
4.2 Ofbiz实体定义
n 命名规则
实体名称(entity-name)首字母大写,如果实体名称由多个关键字组成,那么关键字首字母大写,例如entity-name="TenantDataSource",ofbiz 会在创建数据库表的时候根据entity-name 实体名称除首字母之外的大写字母前加“_”,所以entity-name="TenantDataSource"生成的数据库表名为“Tenant_Data_Source”. 所以要控制entity-name 实体名称不要超过25个字母。
Field 表字段,命名规则与实体名称差不多,唯一不同的是首字母小写
n Entity定义属性
属性名 | 是否必需 | 描述 |
entity-name | Y | 用在实体引擎的 Java API 和其他地方时,所引用的实体名 |
table-name | N | 和实体对应的数据库表名字。此属性可选,如果没有指定,则数 据库表名将从实体名字派生出来 |
package-name | Y | 实体所在包的名字。在大型数据模型中,有成百上千个实体,因 此包用来组织各种实体定义 |
dependent-on | N | 用来指定父实体或此实体倚赖的实体。现在已经不再使用,因为 在实体引擎中都已自动实现,但是保留在这里,主要是用来指定 层次化的实体结构 |
enable-lock | N | 指定此实体是否需要使用优化锁(optimistic locking)。在 此实体上必需存在 lastUpdatedStamp 字段,用来跟踪实体实例 上一 次被 更 新 的 时 间。 如果当前被 更 新 的实 例 和lastUpdatedStamp 不 匹 配 , 则 将 抛 出 EntityLockedException 异常。必需是 true 或 false。默 认是 false |
never-cache | N | 如 果 设 置 为 true , 则 不 允 许 cache 实 体 。 也 不 会 调 用 自 动 cache 清理来提高效率,并且任何试图调用实体上的 cache 方法 都将抛出异常。必需是 true 或 false。默认是 false |
title | N | 实体的 title。如果没有指定,默认是实体所在文件的全局设置 |
copyright | N | 实体版权。如果没有指定,默认是实体所在文件的全局设置 |
author | N | 实体作者。如果没有指定,默认是实体所在文件的全局设置 |
version | N | 实体版本。如果没有指定,默认是实体所在文件的全局设置 |
n Entity的子元素
子元素名 | 多少 | 描述 |
description | 0 or 1 | 实体描述。如果没有指定,默认是实体所在文件的全局设置。 此元素没有属性并且只应该包含一个简单字符串 |
field | 1 to many | 用来声明域是实体的一部分 |
prim-key | 0 to many | 用来声明哪些域是主键 |
relation | 0 to many | 用来声明实体之间的关系 |
index | 0 to many | 索引 |
copyright | 0 to 1 | 版权 |
n 子元素field
属性名 | 是否必需? | 描述 |
name | Y | 字段名,在 Java 代码和其他地方用来引用它 |
col-name | N | 对应的数据库列名。可选属性,如果没有指定,它将从字段名派生 出来 |
type | Y | 字段类型。在运行时(run-time)用来在当前数据源的字段类型文 件中查找,并决定字段和数据库列的 Java 和 SQL 类型
|
属性名 | 是否必需? | 描述 |
field | Y | 字段名,是主键的一部分 |
n 子元素prim-key
|
n
|
子元素relation
属性名 | 是否必需? | 描述 |
type | Y | 指 定 了 包 含 关 系 ( 单 向 ) 基 数 (cardinality) 的 关 系 (relationship) 类 型 , 并 且 是 否 对 基 数 为 1 的 单 关 系:主要有三类“one”、”one-nofk”、”many” (one relationship) 创 建 外 键 。 必 需 是 “one”、“one-nofk”、或“many” |
title | N | 对单个实体,用户可能需要多个关系,因此此属性允许用户 指定一个(前)附加到 rel-entity-name 上的 title,用 来构造关系名。如果没有指定,则 rel-entity-name 独自 用着关系名 |
rel-entity-name | Y | 相关实体名字。关系是从本实体到相关实体 |
fk-name | N | 能够根据关系名自动创建外键,但有两个理由不推荐这样做 对外键和索引,很多数据库有一个很小的最大长度限制(大 约 18 个字符),并且很多数据库需要 FK 名字在整个数据库 中是唯一的,而不是只针对外健的来源表 |
Relation的子元素
子元素名 | 多少 | 描述 |
key-map | 1 to many | key-map 用来指定此实体的字段对应到相关实体中的哪个字段。此 元素有两个属性:field-name 和 rel-field-name。这些属性用 来指定此实体的字段名和相关实体上的字段名。 |
<entity entity-name="TbwInM"package-name="yunkevip.baseInfo"
title="tbw_in_mEntity">
<field name="c_wh_no"type="id"></field>
<field name="c_owner_no"type="id"></field>
<field name="c_in_no"type="id-long"></field>
<field name="c_in_type"type="id"></field>
<field name="c_in_class"type="id"></field>
<field name="c_po_no"type="id-long"></field>
<field name="c_po_type"type="id"></field>
<field name="c_due_dt"type="date-time"></field>
<field name="c_contract_no"type="id-long"></field>
<field name="c_provider_no" type="id-long"></field>
<field name="c_request_dt"type="date-time"></field>
<field name="c_op_status"type="id"></field>
<field name="c_create_flag"type="id"></field>
<field name="c_total_num"type="currency-precise"></field>
<field name="c_total_qty"type="currency-precise"></field>
<field name="c_pack_num"type="currency-precise"></field>
<field name="c_pal_num"type="currency-precise"></field>
<field name="c_total_volumn"type="currency-precise"></field>
<field name="c_weight"type="currency-precise"></field>
<field name="c_force_type"type="id"></field>
<field name="c_begin_dt"type="date-time"></field>
<field name="c_end_dt"type="date-time"></field>
<field name="c_print_num"type="numeric"></field>
<field name="c_note"type="id-vlong"></field>
<field name="c_mk_userno"type="id"></field>
<field name="c_mk_dt"type="date-time"></field>
<field name="c_modified_userno"type="id"></field>
<field name="c_modified_dt"type="date-time"></field>
<field name="c_upload_status"type="id"></field>
<field name="c_upload_filename"type="id-long"></field>
<prim-key field="c_wh_no"/>
<prim-key field="c_owner_no"/>
<prim-key field="c_in_no"/>
<index name="INVTbwInM">
<index-fieldname="c_po_no"/>
</index>
<relationtype="one" fk-name="TbwInM_provider" rel-entity-name="TbwProviderInfo">
<key-mapfield-name="c_provider_no"/>
</relation>
</entity>
n 扩展实体: 继承已存在的实体并对其进行扩展,相当于增加字段和约束
<extend-entityentity-name="UserLogin">
<field name="partyId" type="id"></field>
<relation type="one" fk-name="USER_PARTY"rel-entity-name="Party">
<key-map field-name="partyId"/>
</relation>
<relation type="one-nofk" rel-entity-name="Person">
<key-map field-name="partyId"/>
</relation>
<relation type="one-nofk" rel-entity-name="PartyGroup">
<key-map field-name="partyId"/>
</relation>
</extend-entity>
n 命名规则
实体名称(entity-name)首字母大写,如果实体名称由多个关键字组成,那么关键字首字母大写,例如entity-name="TenantDataSource",ofbiz 会在创建数据库表的时候根据entity-name 实体名称除首字母之外的大写字母前加“_”,所以entity-name="TenantDataSource"生成的数据库表名为“Tenant_Data_Source”. 所以要控制entity-name 实体名称不要超过25个字母。Field 表字段,命名规则与实体名称差不多,唯一不同的是首字母小写
5. OFBiz视图应用
除了直接映射到简单关系型表的实体之外,用户也能够创建映射到多个实体的“virtual”或“view”实体。视图实体和 Oracle、Access、以及其他流行数据库管理系统中视图的概念相同,但是它不会在数据库建立真正的视图。视图实体能够让用户结合或联合多个实体来生成一个新的实体。通过创建一组包含 key-maps 的 view-links,把视图的成员实体链接起来,类似上面描述的关系
n view-entity属性
属性名 | 是否必需? | 描述 |
entity-name | Y | 用在实体引擎的 Java API 和其他地方时,所引用的实体名 |
package-name
| Y | 此实体所属包名字。在一个大的数据模型中有成百上千个实体, 通过包来组织实体定义。
|
dependent-on
| N | 用来指定父实体或此实体倚赖的实体。现在已经不再使用,因为 在实体引擎中都已自动实现,但是保留在这里,主要是用来指定 层次化的实体结构
|
never-cache
| N | 指定了此实体是否需要使用优化锁(optimistic locking)。 在此实体上必需存在 lastUpdatedStamp 字段,用来跟踪实体 实 例 上一 次被 更 新 的 时 间。 如果当前被 更 新 的实 例 和 lastUpdatedStamp 不 匹 配 , 则 将 抛 出 EntityLockedException 异常。必需是 true 或 false。默 认是 false
|
title
| N | 实体的 title。如果没有指定,默认是实体所在文件的全局设置
|
copyrigh | N | 实体版权。如果没有指定,默认是实体所在文件的全局设置 |
author
| N | 实体作者。如果没有指定,默认是实体所在文件的全局设置
|
version
| N | 实体版本。如果没有指定,默认是实体所在文件的全局设置
|
n view-entity子元素
子元素名 | 多少 | 描述 |
description | 0 or 1 | 实体描述。如果没有指定,默认是实体所在文件的全局设 此元素没有属性并且只应该包含一个简单字符串 |
member-entity | 1 to many | 用来声明视图实体的成员实体,并且用什么别名来引用它们 |
alias | 1 to many | 用来声明来自成员实体的别名字段(将是视图实体的一部分) |
view-link | 1 to many | 在视图中,用来声明各个成员实体怎样被联接起来 |
relation | 0 to many | 用于声明实体之间的关系 |
<view-entity entity-name="TbwInMProviderView" package-name="yunkevip.baseInfo"
title="tbw_in_mEntity">
<member-entity entity-alias="m" entity-name="TbwInM"/>
<member-entity entity-alias="p" entity-name="TbwProviderInfo"/>
<member-entity entity-alias="w" entity-name="TbwWhInfo"/>
<member-entity entity-alias="o" entity-name="TbwOwnerInfo"/>
<alias entity-alias="m" name="c_wh_no"></alias>
<alias entity-alias="m" name="c_owner_no"></alias>
<alias entity-alias="m" name="c_in_no"></alias>
<alias entity-alias="m" name="c_in_type"></alias>
<alias entity-alias="m" name="c_in_class"></alias>
<alias entity-alias="m" name="c_po_no"></alias>
<alias entity-alias="m" name="c_po_type"></alias>
<alias entity-alias="m" name="c_due_dt"></alias>
<alias entity-alias="m" name="c_contract_no"></alias>
<alias entity-alias="m" name="c_provider_no"></alias>
<alias entity-alias="p" name="c_provider_name"></alias>
<alias entity-alias="m" name="c_request_dt"></alias>
<alias entity-alias="m" name="c_op_status"></alias>
<alias entity-alias="m" name="c_create_flag"></alias>
<alias entity-alias="m" name="c_total_num"></alias>
<alias entity-alias="m" name="c_total_qty"></alias>
<alias entity-alias="m"name="c_pack_num" ></alias>
<alias entity-alias="m"name="c_pal_num" ></alias>
<alias entity-alias="m"name="c_total_volumn" ></alias>
<alias entity-alias="m"name="c_weight" ></alias>
<alias entity-alias="m"name="c_force_type" ></alias>
<alias entity-alias="m"name="c_begin_dt"></alias>
<alias entity-alias="m"name="c_end_dt" ></alias>
<alias entity-alias="m"name="c_print_num" ></alias>
<alias entity-alias="m"name="c_note" ></alias>
<alias entity-alias="m"name="c_mk_userno" ></alias>
<alias entity-alias="m"name="c_mk_dt" ></alias>
<alias entity-alias="m"name="c_modified_userno" ></alias>
<alias entity-alias="m"name="c_modified_dt" ></alias>
<alias entity-alias="m"name="c_upload_status" ></alias>
<alias entity-alias="m"name="c_upload_filename" ></alias>
<alias entity-alias="w"name="c_wh_name" ></alias>
<alias entity-alias="o"name="c_owner_name" ></alias>
<view-link entity-alias="m"rel-entity-alias="p">
<key-map field-name="c_wh_no"rel-field-name="c_wh_no" />
<key-map field-name="c_owner_no"rel-field-name="c_owner_no" />
<key-map field-name="c_provider_no"rel-field-name="c_provider_no" />
</view-link>
<view-link entity-alias="m"rel-entity-alias="w">
<key-map field-name="c_wh_no"rel-field-name="c_wh_no" />
</view-link>
<view-link entity-alias="m"rel-entity-alias="o">
<key-map field-name="c_wh_no"rel-field-name="c_wh_no" />
<key-map field-name="c_owner_no"rel-field-name="c_owner_no" />
</view-link>
</view-entity>
n 子元素member-entity
属性名 | 是否必需? | 描述 |
entity-alias | Y | 成员实体别名。在所有的成员实体当中必需是唯一的。在视图实 体的定义中,实体别名用来引用此成员实体 |
entity-name | Y | 成员实体对应的实体名字。同一实体在同一视图实体中可以以不 同的别名使用多次 |
n 子元素alias
属性名 | 是否必需? | 描述 |
entity-alias | Y | 此别名字段(aliased field)所对应成员实体的实体别名 |
name | Y | 字段别名(field alias)的名字。和视图实体交互时使用,同 样,字段名是用来和实体交互的。 |
field | N | 对应于实体别名的成员实体的字段名字。如果没有指定,则别名 默认是在名字属性中指定 |
prim-key | N | 用来指定此别名是否是视图实体主键。如果指定了,则要么是 true 要么是 false。如果没有指定,那么实体引擎将从此字段 的来源查询此字段的定义,看它是否是原来实体的主键。 |
group-by | N | 用来指定别名字段应该用于分组结果,主要和其他别名字段上的 功能属性(function attribute)联合使用。完整讨论请参看 正文。要么是 true 要么是 false。默认是 false. |
function | N | 指 定 此 字 段 上 的 功 能 , 用 于 计 算 概 要 信 息 (summaryinformation)。和 group-by 属性联合起来指定怎么组织概,常用函数 min, max, sum, avg, count, count-distinct, upper 和 lower
要信息。更完整的讨论请看正文。 |
<view-entity entity-name="TbSyscfgTypeVieW" package-name="yunkevip.sysbaseInfo" title="tb_syscfgEntity">
<member-entity entity-alias="Ts" entity-name="TbSyscfg"></member-entity>
<alias entity-alias="Ts"name="c_wh_no" field="c_wh_no" group-by="true"></alias>
<alias entity-alias="Ts" name="c_owner_no" field="c_owner_no"group-by="true"></alias>
<alias entity-alias="Ts" name="c_type"field="c_type" group-by="true"></alias>
<alias entity-alias="Ts" name="text"field="c_type" group-by="true"></alias>
</view-entity>
n 字元素view-link
属性名 | 是否必需? | 描述 |
entity-alias | Y | link 来源实体的别名 |
rel-entity-alias | Y | link 目的实体的别名 |
rel-optional | N | 用来指定相关实体是否是可选的。如果是 true,它将影响 到 相 关 实 体 的 外 联 合 (outer join) 。 必 需 是 true 或 false,默认是 false。 |
n 字元素relation
属性名 | 是否必需 | 描述 |
type | Y | 指定关系(relationship)类型,包含关系基数(单向),以 及 是 否 要 为 基 数 是 one 的 关 系 创 建 外 键 。 必 需 是 “one”、“one-nofk”或者“many”。 |
title | N | 因为用户可能需要针对单个实体的多个 one 关系,此属性允许 用户指定一个附加到 rel-entity-name 上的 title,用来构建 关系名字。如果没有指定,则 rel-entity-name 独自用着关系 名 |
rel-entity-name | Y | 相关实体名字。关系是从当前实体到相关实体。 |
|
|
|
fk-name | N | 根据关系名字,外键名字能够自动创建,但不推荐这样做, 原因有二:对外键和索引名字,很多数据库有一个很小的最 大长度限制(大约是 18 个字符),并且很多数据库需要 FK 名字 对整个数据库是唯一的,而不是仅仅针对此外键所在的表。 |
n entity-condition
<entity-condition>
<order-byfield-name="sequenceId"/>
</entity-condition>
n 复杂字段
Select SUM((COALESCE(OI.QUANTITY, 0) - COALESCE(OI.CANCEL_QUANTITY, 0)))
<alias entity-alias="OI"name="quantityOrdered" function="sum">
<complex-alias operator="-">
<complex-alias-field entity-alias="OI"
field="quantity"
default-value="0"/>
<complex-alias-field entity-alias="OI"
field="cancelQuantity"
default-value="0"/>
</complex-alias>
</alias>