<!DOCTYPE html>
<html>

<head>
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>Order Management</title>

  <!-- Bootstrap the UI5 core library -->
  <script id="sap-ui-bootstrap" 
          src="https://openui5.hana.ondemand.com/1.38.7/resources/sap-ui-core.js" 
          data-sap-ui-libs="sap.m" 
          data-sap-ui-theme="sap_bluecrystal" 
          data-sap-ui-compatVersion="edge" 
          data-sap-ui-resourceroots='{"ss.ui5.problem.odataupdinbatch": ""}'
  data-sap-ui-frameOptions='allow'>
  </script>

  <script>
    sap.ui.getCore().attachInit(function() {

      /** jQuery.sap.require("ss/ui5/problem/odataupdinbatch/mockserver");
      new sap.ui.core.ComponentContainer({
        name: "ss.ui5.problem.odataupdinbatch"
      }).placeAt("content"); */

            	sap.ui.require([
      					"ss/ui5/problem/odataupdinbatch/mockserver"
      				], function (mockserver) {
      					// set up test service for local testing
      					mockserver.init();

              new sap.ui.core.ComponentContainer({
                           name : "ss.ui5.problem.odataupdinbatch"
                        }).placeAt("content");
               	});
    });
  </script>
</head>
<!-- UI Content -->

<body class="sapUiBody" id="content">
</body>

</html>
sap.ui.define([
	"sap/ui/core/util/MockServer"
], function(MockServer) {
	"use strict";

	var oMockServer,
		_sAppModulePath = "ss/ui5/problem/odataupdinbatch/",
		_sJsonFilesModulePath = _sAppModulePath ,
		_sMetadataUrl = _sAppModulePath + "metadata",
		_sMainDataSourceUrl = "/here/goes/your/serviceurl/";

	return {
		/**
		 * Initializes the mock server.
		 * You can configure the delay with the URL parameter "serverDelay".
		 * The local mock data in this folder is returned instead of the real data for testing.
		 * @public
		 */

		init: function() {
			var oUriParameters = jQuery.sap.getUriParameters(),
				sJsonFilesUrl = jQuery.sap.getModulePath(_sJsonFilesModulePath),
				sEntity = "Orders",
				sErrorParam = oUriParameters.get("errorType"),
				iErrorCode = sErrorParam === "badRequest" ? 400 : 500,
				sMetadataUrl = jQuery.sap.getModulePath(_sMetadataUrl, ".xml");

			oMockServer = new MockServer({
				rootUri: _sMainDataSourceUrl
			});

			// configure mock server with a delay of 1s
			MockServer.config({
				autoRespond: true,
				autoRespondAfter: (oUriParameters.get("serverDelay") || 1000)
			});

			oMockServer.simulate(sMetadataUrl, {
				sMockdataBaseUrl: sJsonFilesUrl,
				bGenerateMissingMockData: true
			});

			var aRequests = oMockServer.getRequests();

			aRequests.push({ 
				method: "MERGE",
				path: new RegExp("(.*)Order(.*)"),
				response: function(oXhr, sUrlParams) {
          debugger;
					jQuery.sap.log.debug("Mock Server: Incoming request for external resource");
					var oResponse = {
						data: {},
						headers: {
							"Content-Type": "application/json;charset=utf-8",
							"DataServiceVersion": "1.0"
						},
						status: "204",
						statusText: "No Content"
					};
					oXhr.respond(oResponse.status, oResponse.headers, JSON.stringify({ d: oResponse.data }));
				}
			}); 
			
			oMockServer.setRequests(aRequests);

			var fnResponse = function(iErrCode, sMessage, aRequest) {
				aRequest.response = function(oXhr) {
					oXhr.respond(iErrCode, {
						"Content-Type": "text/plain;charset=utf-8"
					}, sMessage);
				};
			};

			// handling the metadata error test
			if (oUriParameters.get("metadataError")) {
				aRequests.forEach(function(aEntry) {
					if (aEntry.path.toString().indexOf("$metadata") > -1) {
						fnResponse(500, "metadata Error", aEntry);
					}
				});
			}

			// Handling request errors
			if (sErrorParam) {
				aRequests.forEach(function(aEntry) {
					if (aEntry.path.toString().indexOf(sEntity) > -1) {
						fnResponse(iErrorCode, sErrorParam, aEntry);
					}
				});
			}
			oMockServer.start();

			jQuery.sap.log.info("Running the app with mock data");
		},

		/**
		 * @public returns the mockserver of the app, should be used in integration tests
		 * @returns {sap.ui.core.util.MockServer} the mockserver instance
		 */
		getMockServer: function() {
			return oMockServer;
		}
	};

});
/* Styles go here */

sap.ui.define([
  "sap/ui/core/UIComponent",
  "sap/ui/model/odata/v2/ODataModel",
	"sap/ui/model/resource/ResourceModel"
], function(UIComponent, ODataModel, ResourceModel) {
  "use strict";

  return UIComponent.extend("ss.ui5.problem.odataupdinbatch.Component", {

    metadata: {
      "version": "1.0.0",
      "includes": [],
      "rootView": {
        "viewName": "ss.ui5.problem.odataupdinbatch.App",
        "type": "XML",
        "id": "app"
      },
      "dependencies": {
        "libs": ["sap.ui.core", "sap.m", "sap.ui.layout"]
      },
      "config": {
        "i18nBundle": "ss.ui5.problem.odataupdinbatch",
        "serviceUrl": "/here/goes/your/serviceurl/",
        "icon": "",
        "favIcon": "",
        "phone": "",
        "phone@2": "",
        "tablet": "",
        "tablet@2": ""
      }
    },


    init: function() {

      var oCore = sap.ui.getCore();
      var mConfig = this.getMetadata().getConfig();

      var oConfig = { 
        disableHeadRequestForToken: true,
        useBatch: true,
        defaultOperationMode: "Client"
      };

      var oModel = new ODataModel(mConfig.serviceUrl, oConfig);

      if (oModel.isBindingModeSupported(sap.ui.model.BindingMode.TwoWay)) { // true
        oModel.setDefaultBindingMode(sap.ui.model.BindingMode.TwoWay);
      }

      this.setModel(oModel);
      this._createMetadataPromise(oModel);

      // set the i18n model
      var oResourceModel = new ResourceModel({
        "bundleName": mConfig.i18nBundle
      });
      this.setModel(oResourceModel, "i18n");

      // call the base component's init function
      UIComponent.prototype.init.apply(this, arguments);
      // create the views based on the url/hash
      //this.getRouter().initialize();

    },


    destroy: function() {
      this.getModel().destroy();
      this.getModel("i18n").destroy();
      // call the base component's destroy function
      UIComponent.prototype.destroy.apply(this, arguments);
    },


    _createMetadataPromise: function(oModel) {
      this.oWhenMetadataIsLoaded = new Promise(function(fnResolve, fnReject) {
         oModel.attachEventOnce("metadataLoaded", fnResolve);
        oModel.attachEventOnce("metadataFailed", fnReject);
      });
    }

  });

});
<mvc:View controllerName="ss.ui5.problem.odataupdinbatch.App" displayBlock="true" xmlns="sap.m" xmlns:mvc="sap.ui.core.mvc" xmlns:l="sap.ui.layout" xmlns:f="sap.ui.layout.form">
	<App id="app">
    <pages>
      <Page id="p1" title="Maintain Order" >
        <f:SimpleForm id="form" minWidth="1024" maxContainerCols="2" editable="true" layout="ResponsiveGridLayout" labelSpanL="3"
			    labelSpanM="3" emptySpanL="1" emptySpanM="1" class="editableForm">
			    <f:content>
    			  <Label text="Order ID"></Label>
    				<Input value="{OrderId}" editable="false"></Input>
    				<Label text="Order Status"></Label>
    				<Input value="{Status}" editable="false"></Input>
    				<Label text="Order Date"></Label>
    				<DatePicker dateValue="{OrderDate}" valueFormat="yyyyMMdd" displayFormat="dd.MM.yyyy"></DatePicker>
    			  <Label text="Customer Name"></Label>
    				<Input value="{CustomerName}" editable="true"></Input>
    			  <Label text="Address Street"></Label>
    				<Input value="{CustomerAddressStreet}" editable="true"></Input>
    				<Label text="Postcode"></Label>
    				<Input value="{CustomerAddressPostcode}" editable="true"></Input>
    				<Label text="Country"></Label>
    				<Input value="{CustomerAddressCountry}" editable="true"></Input>
			    </f:content>
	      </f:SimpleForm>
				<footer><Toolbar><Button text="Save" press="onSave"/></Toolbar></footer>
			</Page>
    </pages>
	</App>
</mvc:View>
sap.ui.define([
  "sap/ui/core/mvc/Controller",
  "sap/ui/model/json/JSONModel"
], function(Controller, JSONModel) {
  "use strict";

  return Controller.extend("ss.ui5.problem.odataupdinbatch.App", {

    onInit: function() {

      this._oODataModel = this.getOwnerComponent().getModel();
      this._oResourceBundle = this.getOwnerComponent().getModel("i18n").getResourceBundle();

      var oViewModel = new JSONModel({
        busy: false,
        delay: 0
      });

      this.getView().setModel(oViewModel, "appView");
      this._oViewModel = this.getView().getModel("appView");

      this.getOwnerComponent().oWhenMetadataIsLoaded.then(this._doBinding.bind(this));

    },

    _doBinding: function() {

      var sPath = "/" + this._oODataModel.createKey("Orders", {
        OrderId: "ORDER01"
      });
      //"/Orders('ORDER01')"
      this.getView().bindElement(sPath);
      
    },

    onSave: function() {

      this._oODataModel.attachEventOnce("batchRequestCompleted", this.onBatchRequestCompleted);
      this._oODataModel.attachEventOnce("batchRequestFailed", this.onBatchRequestFailed);
      
      this._oODataModel.submitChanges();

    },

    onBatchRequestCompleted: function(oData) {
      debugger;
    },

    onBatchRequestFailed: function(oData) {
      debugger;
    }

  });
});
<?xml version="1.0" encoding="utf-8"?>
<edmx:Edmx Version="1.0" xmlns:edmx="http://schemas.microsoft.com/ado/2007/06/edmx" xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" xmlns:sap="http://www.sap.com/Protocols/SAPData">
    <edmx:DataServices m:DataServiceVersion="2.0">
        <Schema Namespace="odataupdinbatch_srv" xml:lang="en" sap:schema-version="1 " xmlns="http://schemas.microsoft.com/ado/2008/09/edm">
            <EntityType Name="Order" sap:content-version="1">
                <Key>
                    <PropertyRef Name="OrderId" />
                </Key>
                <Property Name="OrderId" Type="Edm.String" MaxLength="10" sap:label="Order ID" sap:creatable="false" sap:updatable="false" sap:sortable="true" sap:filterable="true" />
                <Property Name="OrderDate" Type="Edm.DateTime" Precision="7" sap:label="Order date" sap:creatable="true" sap:updatable="true" sap:sortable="true" />
                <Property Name="Status" Type="Edm.String" MaxLength="1" sap:label="Status" sap:creatable="false" sap:updatable="false" sap:sortable="true" sap:filterable="true" />
                <Property Name="CustomerName" Type="Edm.String" MaxLength="100" sap:label="Customer Name" sap:creatable="true" sap:updatable="true" sap:sortable="true" sap:filterable="true" />
                <Property Name="CustomerAddressStreet" Type="Edm.String" MaxLength="100" sap:label="Street" sap:creatable="true" sap:updatable="true" sap:sortable="true" sap:filterable="true" />
                <Property Name="CustomerAddressPostcode" Type="Edm.String" MaxLength="20" sap:label="Postcode" sap:creatable="true" sap:updatable="true" sap:sortable="true" sap:filterable="true" />
                <Property Name="CustomerAddressCountry" Type="Edm.String" MaxLength="40" sap:label="Country" sap:creatable="true" sap:updatable="true" sap:sortable="true" sap:filterable="true" />
            </EntityType>
             <EntityContainer Name="odataupdinbatch_srv_Entities" m:IsDefaultEntityContainer="true" sap:supported-formats="atom json xlsx">
                <EntitySet Name="Orders" EntityType="odataupdinbatch_srv.Order" sap:label="Orders" sap:creatable="true" sap:deletable="true" sap:searchable="true" sap:content-version="1" />
            </EntityContainer>
        </Schema>
    </edmx:DataServices>
</edmx:Edmx>
[
{
  "OrderId": "ORDER01",
  "OrderDate": "/Date(1245318362000)/",
  "Status": "P",
  "CustomerName": "Joe Blogs",
  "CustomerAddressStreet": "1 Green Street",
  "CustomerAddressPostcode": "SW1 1AA",
  "CustomerAddressCountry": "United Kingdom",
  "__metadata": {
      "uri": "Orders('ORDER01')",
      "type": "odataupdinbatch_srv.Order"
   }
},
{
  "OrderId": "ORDER02",
  "OrderDate": "/Date(1265318382000)/",
  "Status": "C",
  "CustomerName": "Jane Blogs",
  "CustomerAddressStreet": "1 Blue Street",
  "CustomerAddressPostcode": "KT2 2BB",
  "CustomerAddressCountry": "United Kingdom",
  "__metadata": {
      "uri": "Orders('ORDER02')",
      "type": "odataupdinbatch_srv.Order"
   }
}
]