⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 genericdao.java

📁 Sequoia ERP是一个真正的企业级开源ERP解决方案。它提供的模块包括:电子商务应用(e-commerce), POS系统(point of sales),知识管理,存货与仓库管理
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
            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 + -