[ https://issues.apache.org/jira/browse/OFBIZ-5760?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14143915#comment-14143915 ]
Nicolas Malin edited comment on OFBIZ-5760 at 9/22/14 10:07 PM: ---------------------------------------------------------------- A better way to manage all entity assoc with more than 2 primary keys {code:java} Index: framework/service/src/org/ofbiz/service/engine/EntityAutoEngine.java =================================================================== --- framework/service/src/org/ofbiz/service/engine/EntityAutoEngine.java (révision 1625001) +++ framework/service/src/org/ofbiz/service/engine/EntityAutoEngine.java (copie de travail) @@ -19,6 +19,7 @@ package org.ofbiz.service.engine; import java.util.Iterator; +import java.util.LinkedList; import java.util.Locale; import java.util.Map; @@ -89,11 +90,16 @@ try { boolean allPksInOnly = true; + LinkedList<String> pkFieldNameOutOnly = null; for (ModelField pkField: modelEntity.getPkFieldsUnmodifiable()) { ModelParam pkParam = modelService.getParam(pkField.getName()); if (pkParam.isOut()) { allPksInOnly = false; } + if (pkParam.isOut() && !pkParam.isIn()) { + if (pkFieldNameOutOnly == null) pkFieldNameOutOnly = new LinkedList(); + pkFieldNameOutOnly.add(pkField.getName()); + } } if ("create".equals(modelService.invoke)) { @@ -215,12 +221,28 @@ */ newEntity.setPKFields(parameters, true); } else { + /* We haven't all Pk and their are 3 or more, now check if isn't a associate entity with own sequence + <set-pk-fields map="parameters" value-field="newEntity"/> + <sequenced-id sequence-name="ExempleItemAssoc" field="newEntity.exempleItemAsscId"/> + <create-value value-field="newEntity"/> + */ + if (pkFieldNameOutOnly != null && pkFieldNameOutOnly.size() == 1) { + newEntity.setPKFields(parameters, true); + String pkFieldName = pkFieldNameOutOnly.getFirst(); + //if it's a fromDate, don't update it now, it's will be on next step + if (! "fromDate".equals(pkFieldName)) { + String pkValue = dctx.getDelegator().getNextSeqId(modelEntity.getEntityName()); + newEntity.set(pkFieldName, pkValue); + result.put(pkFieldName, pkValue); + } + } else { throw new GenericServiceException("In Service [" + modelService.name + "] which uses the entity-auto engine with the create invoke option: " + "could not find a valid combination of primary key settings to do a known create operation; options include: " + "1. a single OUT pk for primary auto-sequencing, " + "2. a single INOUT pk for primary auto-sequencing with optional override, " + "3. a 2-part pk with one part IN (existing primary pk) and one part OUT (the secdonary pk to sub-sequence, " + "4. all pk fields are IN for a manually specified primary key"); + } } // handle the case where there is a fromDate in the pk of the entity, and it is optional or undefined in the service def, populate automatically @@ -229,6 +251,9 @@ ModelParam fromDateParam = modelService.getParam("fromDate"); if (fromDateParam == null || (fromDateParam.isOptional() && parameters.get("fromDate") == null)) { newEntity.set("fromDate", UtilDateTime.nowTimestamp()); + if (fromDateParam.isOut()) { + result.put("fromDate", newEntity.get("fromDate")); + } } } {code} was (Author: soledad): A better way to manage all entity assoc with more than 2 primary keys [code:java] Index: framework/service/src/org/ofbiz/service/engine/EntityAutoEngine.java =================================================================== --- framework/service/src/org/ofbiz/service/engine/EntityAutoEngine.java (révision 1625001) +++ framework/service/src/org/ofbiz/service/engine/EntityAutoEngine.java (copie de travail) @@ -19,6 +19,7 @@ package org.ofbiz.service.engine; import java.util.Iterator; +import java.util.LinkedList; import java.util.Locale; import java.util.Map; @@ -89,11 +90,16 @@ try { boolean allPksInOnly = true; + LinkedList<String> pkFieldNameOutOnly = null; for (ModelField pkField: modelEntity.getPkFieldsUnmodifiable()) { ModelParam pkParam = modelService.getParam(pkField.getName()); if (pkParam.isOut()) { allPksInOnly = false; } + if (pkParam.isOut() && !pkParam.isIn()) { + if (pkFieldNameOutOnly == null) pkFieldNameOutOnly = new LinkedList(); + pkFieldNameOutOnly.add(pkField.getName()); + } } if ("create".equals(modelService.invoke)) { @@ -215,12 +221,28 @@ */ newEntity.setPKFields(parameters, true); } else { + /* We haven't all Pk and their are 3 or more, now check if isn't a associate entity with own sequence + <set-pk-fields map="parameters" value-field="newEntity"/> + <sequenced-id sequence-name="ExempleItemAssoc" field="newEntity.exempleItemAsscId"/> + <create-value value-field="newEntity"/> + */ + if (pkFieldNameOutOnly != null && pkFieldNameOutOnly.size() == 1) { + newEntity.setPKFields(parameters, true); + String pkFieldName = pkFieldNameOutOnly.getFirst(); + //if it's a fromDate, don't update it now, it's will be on next step + if (! "fromDate".equals(pkFieldName)) { + String pkValue = dctx.getDelegator().getNextSeqId(modelEntity.getEntityName()); + newEntity.set(pkFieldName, pkValue); + result.put(pkFieldName, pkValue); + } + } else { throw new GenericServiceException("In Service [" + modelService.name + "] which uses the entity-auto engine with the create invoke option: " + "could not find a valid combination of primary key settings to do a known create operation; options include: " + "1. a single OUT pk for primary auto-sequencing, " + "2. a single INOUT pk for primary auto-sequencing with optional override, " + "3. a 2-part pk with one part IN (existing primary pk) and one part OUT (the secdonary pk to sub-sequence, " + "4. all pk fields are IN for a manually specified primary key"); + } } // handle the case where there is a fromDate in the pk of the entity, and it is optional or undefined in the service def, populate automatically @@ -229,6 +251,9 @@ ModelParam fromDateParam = modelService.getParam("fromDate"); if (fromDateParam == null || (fromDateParam.isOptional() && parameters.get("fromDate") == null)) { newEntity.set("fromDate", UtilDateTime.nowTimestamp()); + if (fromDateParam.isOut()) { + result.put("fromDate", newEntity.get("fromDate")); + } } } [code] > Convert HR entites CRUD service from simple to entity-auto > ---------------------------------------------------------- > > Key: OFBIZ-5760 > URL: https://issues.apache.org/jira/browse/OFBIZ-5760 > Project: OFBiz > Issue Type: Improvement > Components: humanres > Affects Versions: Trunk > Reporter: Nicolas Malin > Priority: Trivial > Labels: crud, entity-auto > Attachments: OFBIZ-5760.patch, OFBIZ-5760.patch > > > I converted CRUD service to entity-auto for : > || Entity || IHM Test|| > |PartyQual | {color:red}KO{color}, wait decision | > |PartyResume| OK | > |PartySkill| OK | > |PerfReview| {color:red}KO{color} | > |PerfReviewItem| OK | > |PerformanceNote| - | > |Employment| OK | > |EmploymentApp| - | > |PartyBenefit| OK | > |PayGrade| OK | > |PayHistory| - | > |PayrollPreference| - | > |SalaryStep| OK | > |TerminationReason| OK | > |UnemploymentClaim| OK | > |EmplPosition| OK | > |EmplPositionFulfillment| OK | > |EmplPositionReportingStruct| OK | > |EmplPositionResponsibility| OK | > |ValidResponsibility| - | > |SkillType| OK | > |ResponsibilityType| OK | > |TerminationType| OK | > |EmplPositionType| OK | > |EmplPositionTypeRate| OK | > |AgreementEmploymentAppl| - | > |EmplLeave| OK, only on update | > |EmplLeaveType| OK | > |JobRequisition| OK | > |EmploymentApp| - | > |JobInterview| OK | > |JobInterviewType| OK | > |PersonTraining| - | > |TrainingClassType| OK | > |EmplLeaveReasonType| - | > With this first pass I tested all entities in IHM Test = OK. > I need to correct the failed tests and continue the untested entities. > It's a little big, so I prefer to open this issue. -- This message was sent by Atlassian JIRA (v6.3.4#6332)