📄 genericdao.java
字号:
entity.set(ModelEntity.STAMP_FIELD, TransactionUtil.getTransactionUniqueNowStamp()); addFieldIfMissing(fieldsToSave, ModelEntity.STAMP_FIELD, modelEntity); } String sql = "UPDATE " + modelEntity.getTableName(datasourceInfo) + " SET " + modelEntity.colNameString(fieldsToSave, "=?, ", "=?", false) + " WHERE " + SqlJdbcUtil.makeWhereStringFromFields(modelEntity.getPksCopy(), entity, "AND"); int retVal = 0; try { sqlP.prepareStatement(sql); SqlJdbcUtil.setValues(sqlP, fieldsToSave, entity, modelFieldTypeReader); SqlJdbcUtil.setPkValues(sqlP, modelEntity, entity, modelFieldTypeReader); retVal = sqlP.executeUpdate(); entity.synchronizedWithDatasource(); } catch (GenericEntityException e) { throw new GenericEntityException("while updating: " + entity.toString(), e); } finally { sqlP.close(); } if (retVal == 0) { throw new GenericEntityNotFoundException("Tried to update an entity that does not exist."); } return retVal; } public int updateByCondition(ModelEntity modelEntity, Map fieldsToSet, EntityCondition condition) throws GenericEntityException { SQLProcessor sqlP = new SQLProcessor(helperName); try { return updateByCondition(modelEntity, fieldsToSet, condition, sqlP); } catch (GenericDataSourceException e) { sqlP.rollback(); throw new GenericDataSourceException("Generic Entity Exception occured in updateByCondition", e); } finally { sqlP.close(); } } public int updateByCondition(ModelEntity modelEntity, Map fieldsToSet, EntityCondition condition, SQLProcessor sqlP) throws GenericEntityException { if (modelEntity == null || fieldsToSet == null || condition == null) return 0; if (modelEntity instanceof ModelViewEntity) { throw new org.ofbiz.entity.GenericNotImplementedException("Operation updateByCondition not supported yet for view entities"); } String sql = "UPDATE " + modelEntity.getTableName(datasourceInfo); sql += " SET "; Iterator i = fieldsToSet.keySet().iterator(); List fieldList = new LinkedList(); boolean firstField = true; while (i.hasNext()) { String name = (String) i.next(); ModelField field = modelEntity.getField(name); if (field != null) { if (!firstField) { sql += ", "; } else { firstField = false; } sql += field.getColName() + " = ?"; fieldList.add(field); } } sql += " WHERE " + condition.makeWhereString(modelEntity, null); try { sqlP.prepareStatement(sql); Iterator fi = fieldList.iterator(); while (fi.hasNext()) { ModelField field = (ModelField) fi.next(); Object value = fieldsToSet.get(field.getName()); SqlJdbcUtil.setValue(sqlP, field, modelEntity.getEntityName(), value, modelFieldTypeReader ); } return sqlP.executeUpdate(); } finally { sqlP.close(); } } /* ====================================================================== */ /* ====================================================================== */ /** * Try to update the given ModelViewEntity by trying to insert/update on the entities of which the view is composed. * * Works fine with standard O/R mapped models, but has some restrictions meeting more complicated view entities. * <li>A direct link is required, which means that one of the ModelViewLink field entries must have a value found * in the given view entity, for each ModelViewLink</li> * <li>For now, each member entity is updated iteratively, so if eg. the second member entity fails to update, * the first is written although. See code for details. Try to use "clean" views, until code is more robust ...</li> * <li>For now, aliased field names in views are not processed correctly, I guess. To be honest, I did not * find out how to construct such a view - so view fieldnames must have same named fields in member entities.</li> * <li>A new exception, e.g. GenericViewNotUpdatable, should be defined and thrown if the update fails</li> * */ private int singleUpdateView(GenericEntity entity, ModelViewEntity modelViewEntity, List fieldsToSave, SQLProcessor sqlP) throws GenericEntityException { GenericDelegator delegator = entity.getDelegator(); int retVal = 0; ModelEntity memberModelEntity = null; // Construct insert/update for each model entity Iterator meIter = modelViewEntity.getMemberModelMemberEntities().entrySet().iterator(); while (meIter != null && meIter.hasNext()) { Map.Entry meMapEntry = (Map.Entry) meIter.next(); ModelViewEntity.ModelMemberEntity modelMemberEntity = (ModelViewEntity.ModelMemberEntity) meMapEntry.getValue(); String meName = modelMemberEntity.getEntityName(); String meAlias = modelMemberEntity.getEntityAlias(); if (Debug.verboseOn()) Debug.logVerbose("[singleUpdateView]: Processing MemberEntity " + meName + " with Alias " + meAlias, module); try { memberModelEntity = delegator.getModelReader().getModelEntity(meName); } catch (GenericEntityException e) { throw new GenericEntityException("Failed to get model entity for " + meName, e); } Map findByMap = FastMap.newInstance(); // Now iterate the ModelViewLinks to construct the "WHERE" part for update/insert Iterator linkIter = modelViewEntity.getViewLinksIterator(); while (linkIter != null && linkIter.hasNext()) { ModelViewEntity.ModelViewLink modelViewLink = (ModelViewEntity.ModelViewLink) linkIter.next(); if (modelViewLink.getEntityAlias().equals(meAlias) || modelViewLink.getRelEntityAlias().equals(meAlias)) { Iterator kmIter = modelViewLink.getKeyMapsIterator(); while (kmIter != null && kmIter.hasNext()) { ModelKeyMap keyMap = (ModelKeyMap) kmIter.next(); String fieldName = ""; if (modelViewLink.getEntityAlias().equals(meAlias)) { fieldName = keyMap.getFieldName(); } else { fieldName = keyMap.getRelFieldName(); } if (Debug.verboseOn()) Debug.logVerbose("[singleUpdateView]: --- Found field to set: " + meAlias + "." + fieldName, module); Object value = null; if (modelViewEntity.isField(keyMap.getFieldName())) { value = entity.get(keyMap.getFieldName()); if (Debug.verboseOn()) Debug.logVerbose("[singleUpdateView]: --- Found map value: " + value.toString(), module); } else if (modelViewEntity.isField(keyMap.getRelFieldName())) { value = entity.get(keyMap.getRelFieldName()); if (Debug.verboseOn()) Debug.logVerbose("[singleUpdateView]: --- Found map value: " + value.toString(), module); } else { throw new GenericNotImplementedException("Update on view entities: no direct link found, unable to update"); } findByMap.put(fieldName, value); } } } // Look what there already is in the database List meResult = null; try { meResult = delegator.findByAnd(meName, findByMap); } catch (GenericEntityException e) { throw new GenericEntityException("Error while retrieving partial results for entity member: " + meName, e); } if (Debug.verboseOn()) Debug.logVerbose("[singleUpdateView]: --- Found " + meResult.size() + " results for entity member " + meName, module); // Got results 0 -> INSERT, 1 -> UPDATE, >1 -> View is nor updatable GenericValue meGenericValue = null; if (meResult.size() == 0) { // Create new value to insert try { // Create new value to store meGenericValue = delegator.makeValue(meName, findByMap); } catch (Exception e) { throw new GenericEntityException("Could not create new value for member entity" + meName + " of view " + modelViewEntity.getEntityName(), e); } } else if (meResult.size() == 1) { // Update existing value meGenericValue = (GenericValue) meResult.iterator().next(); } else { throw new GenericEntityException("Found more than one result for member entity " + meName + " in view " + modelViewEntity.getEntityName() + " - this is no updatable view"); } // Construct fieldsToSave list for this member entity List meFieldsToSave = FastList.newInstance(); Iterator fieldIter = fieldsToSave.iterator(); while (fieldIter != null && fieldIter.hasNext()) { ModelField modelField = (ModelField) fieldIter.next(); if (memberModelEntity.isField(modelField.getName())) { ModelField meModelField = memberModelEntity.getField(modelField.getName()); if (meModelField != null) { meGenericValue.set(meModelField.getName(), entity.get(modelField.getName())); meFieldsToSave.add(meModelField); if (Debug.verboseOn()) Debug.logVerbose("[singleUpdateView]: --- Added field to save: " + meModelField.getName() + " with value " + meGenericValue.get(meModelField.getName()), module); } else { throw new GenericEntityException("Could not get field " + modelField.getName() + " from model entity " + memberModelEntity.getEntityName()); } } } /* * Finally, do the insert/update * TODO: * Do the real inserts/updates outside the memberEntity-loop, * only if all of the found member entities are updatable. * This avoids partial creation of member entities, which would mean data inconsistency: * If not all member entities can be updated, then none should be updated */ if (meResult.size() == 0) { retVal += singleInsert(meGenericValue, memberModelEntity, memberModelEntity.getFieldsCopy(), sqlP); } else { if (meFieldsToSave.size() > 0) { retVal += singleUpdate(meGenericValue, memberModelEntity, meFieldsToSave, sqlP); } else { if (Debug.verboseOn()) Debug.logVerbose("[singleUpdateView]: No update on member entity " + memberModelEntity.getEntityName() + " needed", module); } } } return retVal; } /* ====================================================================== */ /* ====================================================================== */ public void select(GenericEntity entity) throws GenericEntityException { SQLProcessor sqlP = new SQLProcessor(helperName); try { select(entity, sqlP); } finally { sqlP.close(); } } public void select(GenericEntity entity, SQLProcessor sqlP) throws GenericEntityException { ModelEntity modelEntity = entity.getModelEntity(); if (modelEntity == null) { throw new GenericModelException("Could not find ModelEntity record for entityName: " + entity.getEntityName()); } if (modelEntity.getPksSize() <= 0) { throw new GenericEntityException("Entity has no primary keys, cannot select by primary key"); } StringBuffer sqlBuffer = new StringBuffer("SELECT "); if (modelEntity.getNopksSize() > 0) { sqlBuffer.append(modelEntity.colNameString(modelEntity.getNopksCopy(), ", ", "", datasourceInfo.aliasViews)); } else { sqlBuffer.append("*"); } sqlBuffer.append(SqlJdbcUtil.makeFromClause(modelEntity, datasourceInfo)); sqlBuffer.append(SqlJdbcUtil.makeWhereClause(modelEntity, modelEntity.getPksCopy(), entity, "AND", datasourceInfo.joinStyle)); try { sqlP.prepareStatement(sqlBuffer.toString(), true, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); SqlJdbcUtil.setPkValues(sqlP, modelEntity, entity, modelFieldTypeReader); sqlP.executeQuery(); if (sqlP.next()) { int idx = 1; Iterator nopkIter = modelEntity.getNopksIterator(); while (nopkIter.hasNext()) { ModelField curField = (ModelField) nopkIter.next(); SqlJdbcUtil.getValue(sqlP.getResultSet(), idx, curField, entity, modelFieldTypeReader); idx++; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -