OFBiz的实体配置
<entity-resource type="model" reader-name="main" loader="main" location="entitydef/entitymodel.xml"/>
实体定义的命名规则
%ofbiz_home%\framework\entity\fieldtype\fieldtypeXXX.xml 其中XXX为你使用的数据库名称
<entity entity-name="DsConsultant" package-name="com.xxx.crm.drivingschool"> <field name="consultantId" type="id-ne"/> <field name="consultantName" type="name"/> <field name="consultantCode" type="name"/> <field name="gender" type="indicator"/> <field name="city" type="name"/> <field name="email" type="name"/> <prim-key field="consultantId"/> </entity>
普通实体
<entity entity-name="TenantDataSource" package-name="org.ofbiz.entity.tenant"> <description> There should be one record for each tenant and each group-map for the active delegator. The jdbc fields will override the datasource -> inline-jdbc values for the per-tenant delegator. </description> <field name="tenantId" type="id-ne"/> <field name="entityGroupName" type="name"/> <field name="jdbcUri" type="long-varchar"/> <field name="jdbcUsername" type="long-varchar"/> <field name="jdbcPassword" type="long-varchar"></field> <prim-key field="tenantId"/> <prim-key field="entityGroupName"/> <relation type="one" fk-name="TNTDTSRC_TNT" rel-entity-name="Tenant"> <key-map field-name="tenantId"/> </relation> </entity>
视图实体
<view-entity entity-name="WorkEffortAssocView" package-name="org.ofbiz.workeffort.workeffort" title="Work Effort Association Entity with Name"> <member-entity entity-alias="WA" entity-name="WorkEffortAssoc"/> <member-entity entity-alias="WETO" entity-name="WorkEffort"/> <alias-all entity-alias="WA"/> <alias entity-alias="WETO" name="workEffortToName" field="workEffortName"/> <alias entity-alias="WETO" name="workEffortToSetup" field="estimatedSetupMillis"/> <alias entity-alias="WETO" name="workEffortToRun" field="estimatedMilliSeconds"/> <alias entity-alias="WETO" name="workEffortToParentId" field="workEffortParentId"/> <alias entity-alias="WETO" name="workEffortToCurrentStatusId" field="currentStatusId"/> <alias entity-alias="WETO" name="workEffortToWorkEffortPurposeTypeId" field="workEffortPurposeTypeId"/> <alias entity-alias="WETO" name="workEffortToEstimatedStartDate" field="estimatedStartDate"/> <alias entity-alias="WETO" name="workEffortToEstimatedCompletionDate" field="estimatedCompletionDate"/> <alias entity-alias="WETO" name="workEffortToActualStartDate" field="actualStartDate"/> <alias entity-alias="WETO" name="workEffortToActualCompletionDate" field="actualCompletionDate"/> <view-link entity-alias="WA" rel-entity-alias="WETO"> <key-map field-name="workEffortIdTo" rel-field-name="workEffortId"/> </view-link> <relation type="one-nofk" fk-name="WK_EFFRTASSV_FWE" title="From" rel-entity-name="WorkEffort"> <key-map field-name="workEffortIdFrom" rel-field-name="workEffortId"/> </relation> </view-entity>
<member-entity entity-alias="SR" entity-name="DsStudentReservation"/>
<alias name="id" entity-alias="SR" field="id"/>
<view-link entity-alias="SR" rel-entity-alias="SS"> <key-map field-name="studentId" rel-field-name="id"/> </view-link>
<alias-all entity-alias="ODD" prefix="orderDate" group-by="true"> <exclude field="dimensionId"/> </alias-all>
<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>
Select SUM((COALESCE(OI.QUANTITY, 0) - COALESCE(OI.CANCEL_QUANTITY, 0)))
<alias entity-alias="OI" > <complex-alias operator="-"> <complex-alias-field entity-alias="OI" field="quantity" default-value="0" function="sum"/> <complex-alias-field entity-alias="OI" field="cancelQuantity" default-value="0" function="sum"/> </complex-alias> </alias>
SELECT (SUM(COALESCE(OI.QUANTITY,'0')) - SUM(COALESCE(OI.CANCEL_QUANTITY,'0')))
Delegator
- Delegator delegator = ctx.getDelegator();
- String id = delegator.getNextSeqId("ServiceCar");
- GenericValue dsServiceCar = delegator.makeValue("ServiceCar", UtilMisc.toMap(
- "id", id,
- "carType", context.get("carType")
- "carNumber", context.get("carNumber"),
- "coachId", context.get("coachId"),
- "phone", context.get("phone")
- ));
- delegator.create(dsServiceCar);
- java.lang.Exception: Failure in create operation for entity [DsSignupStudent]: org.ofbiz.entity.GenericEntityException:
- Error while inserting: [GenericEntity:DsSignupStudent][carType,DRIVING_TYPE_C1(java.lang.String)][comment,null()][commissionFee,0(java.lang.Long)][consultantId,10020(java.lang.String)][course1Time,0(java.lang.Long)][course2Time,0(java.lang.Long)][course3Time,0(java.lang.Long)][createdStamp,2015-10-10 09:44:05.147(java.sql.Timestamp)][createdTxStamp,2015-10-10 09:44:05.146(java.sql.Timestamp)][drivingSchoolId,2(java.lang.String)][handleBy,null()][id,10122(java.lang.String)][idCard,2123123(java.lang.String)][infoChannel,INFO_CHANNEL_NET(java.lang.String)][isBodyCheckTable,null()][isCommissionPayed,null()][isContractTable,null()][isFinger,null()][isGivenMaterial,null()][isIdCardTable,null()][isPersonalPhoto,null()][isReceipt,null()][isSignupTable,null()][isUrgent,null()][lastUpdatedStamp,2015-10-10 09:44:05.147(java.sql.Timestamp)][lastUpdatedTxStamp,2015-10-10 09:44:05.146(java.sql.Timestamp)][localTrain,LOCAL_TRAIN_BD(java.lang.String)][name,a1(java.lang.String)][nextVisitDate,2015-10-11(java.sql.Date)][payForm,PAY_FORM_CARD(java.lang.String)][payMethod,PAY_METHOD_ALL(java.lang.String)][payedFee,111(java.lang.Long)][phone,122(java.lang.String)][referrerId,null()][serviceCityId,2(java.lang.String)][signupDate,2015-10-10(java.sql.Date)][signupFee,111(java.lang.Long)][signupStore,SIGNUP_STORE_FHD(java.lang.String)][studentStatus,STUDENT_STATUS_Y(java.lang.String)][studyProgress,STUDY_PROGRESS_LR(java.lang.String)][trainType,TRAIN_TYPE_ZX(java.lang.String)][trainingSiteId,10000(java.lang.String)] (SQL Exception while executing the following:INSERT INTO DS_SIGNUP_STUDENT (ID, SERVICE_CITY_ID, SIGNUP_STORE, NAME, ID_CARD, PHONE, CAR_TYPE, SIGNUP_FEE, PAY_METHOD, PAY_FORM, PAYED_FEE, SIGNUP_DATE, STUDY_PROGRESS, DRIVING_SCHOOL_ID, LOCAL_TRAIN, TRAIN_TYPE, INFO_CHANNEL, TRAINING_SITE_ID, CONSULTANT_ID, REFERRER_ID, NEXT_VISIT_DATE, STUDENT_STATUS, COMMENT, COURSE1_TIME, COURSE2_TIME, COURSE3_TIME, IS_ID_CARD_TABLE, IS_BODY_CHECK_TABLE, IS_SIGNUP_TABLE, IS_PERSONAL_PHOTO, IS_CONTRACT_TABLE, IS_RECEIPT, IS_FINGER, IS_GIVEN_MATERIAL, IS_URGENT, HANDLE_BY, COMMISSION_FEE, IS_COMMISSION_PAYED, IS_EXAM_FEE_PAYED, LAST_UPDATED_STAMP, LAST_UPDATED_TX_STAMP, CREATED_STAMP, CREATED_TX_STAMP) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) (Duplicate entry '10122' for key 'PRIMARY')).
- Rolling back transaction.
- at
- org.ofbiz.entity.transaction.TransactionUtil.setRollbackOnly(TransactionUtil.java:378) [ofbiz-entity-test.jar:?]
select * from sequence_value_item;

- condition = EntityCondition.makeCondition(EntityJoinOperator.AND,EntityCondition.makeCondition("isConfirmed", EntityOperator.EQUALS, 'Y'),cityCondition,deleteCondition);
- context.allRecords = delegator.findList("DsStudentPayRecordView", condition, null, ["-recordDate"], null, false);
在配置文件entityengine.xml中,需要使用GenericHelperDAO:
<datasource name="localmysqlolap"
helper-class="org.ofbiz.entity.datasource.GenericHelperDAO"
field-type-name="mysql"
check-on-start="true"
add-missing-on-start="true"
check-pks-on-start="false"
use-foreign-keys="true"
join-style="ansi-no-parenthesis"
alias-view-columns="false"
drop-fk-use-foreign-key-keyword="true"
table-type="InnoDB"
character-set="utf8"
collate="utf8_general_ci">
<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"/>
<inline-jdbc
jdbc-driver="com.mysql.jdbc.Driver"
jdbc-uri="jdbc:mysql://xxx.com:3306/xxx?useUnicode=true&characterEncoding=utf8&autoReconnect=true&failOverReadOnly=false"
jdbc-username="xxx"
jdbc-password="xxxx"
isolation-level="ReadCommitted"
pool-minsize="2"
pool-maxsize="250"
time-between-eviction-runs-millis="600000"/><!-- Please note that at least one person has experienced a problem with this value with MySQL
and had to set it to -1 in order to avoid this issue.
For more look at http://markmail.org/thread/5sivpykv7xkl66px and http://commons.apache.org/dbcp/configuration.html-->
<!-- <jndi-jdbc jndi-server-name="localjndi" jndi-name="java:/MySqlDataSource" isolation-level="Serializable"/> -->
</datasource>
找到其中的group-name,在本文件声明中的group-name为:
<delegator name="test" entity-model-reader="main" entity-group-reader="main" entity-eca-reader="main">
<group-map group-name="org.ofbiz" datasource-name="localmysql"/>
<group-map group-name="org.ofbiz.olap" datasource-name="localmysqlolap"/>
<group-map group-name="org.ofbiz.tenant" datasource-name="localmysqltenant"/>
</delegator>
可以看出,对应的group-name为org.ofbiz.tenant,使用这个group-name来构建SQLProcessor,就可以进行数据库SQL查询。
在Groovy中的写法为:
- sqlProcessor = new SQLProcessor(delegator.getGroupHelperInfo("org.ofbiz.tenant"));
- result = sqlProcessor.executeQuery("select * from xxx")
- while (result.next()){
- println result.getString("id")
- }
可以通过调用ResultSet的方式进行数据库的查询操作,此时SQL就需要为可以在数据库中直接查询的SQL了。