Author: buildbot
Date: Tue Nov 17 14:25:40 2015
New Revision: 972703
Log:
Staging update by buildbot for olingo
Modified:
websites/staging/olingo/trunk/content/ (props changed)
websites/staging/olingo/trunk/content/doc/odata4/tutorials/deep_insert/tutorial_deep_insert.html
Propchange: websites/staging/olingo/trunk/content/
------------------------------------------------------------------------------
--- cms:source-revision (original)
+++ cms:source-revision Tue Nov 17 14:25:40 2015
@@ -1 +1 @@
-1714771
+1714791
Modified:
websites/staging/olingo/trunk/content/doc/odata4/tutorials/deep_insert/tutorial_deep_insert.html
==============================================================================
---
websites/staging/olingo/trunk/content/doc/odata4/tutorials/deep_insert/tutorial_deep_insert.html
(original)
+++
websites/staging/olingo/trunk/content/doc/odata4/tutorials/deep_insert/tutorial_deep_insert.html
Tue Nov 17 14:25:40 2015
@@ -104,7 +104,7 @@ h2:hover > .headerlink, h3:hover > .head
<p><strong>Note:</strong>
The final source code can be found in the project <a
href="https://git-wip-us.apache.org/repos/asf/olingo-odata4">git repository</a>.
A detailed description how to checkout the tutorials can be found <a
href="/doc/odata4/tutorials/prerequisites/prerequisites.html">here</a>. <br />
-This tutorial can be found in subdirectory /samples/tutorials/p11_batch</p>
+This tutorial can be found in subdirectory
/samples/tutorials/p12_deep_insert</p>
<p><strong>Table of Contents</strong></p>
<ol>
<li>Introduction</li>
@@ -147,13 +147,154 @@ Such a request is issued againest the UR
<p>As a shortcut you should checkout the prepared tutorial project in the <a
href="https://git-wip-us.apache.org/repos/asf/olingo-odata4">git repository</a>
in folder /samples/tutorials/p12_deep_insert_preparation.</p>
<p>Afterwards do a Deploy and run: it should be working. At this state you can
perform CRUD operations and do navigations between products and categories.</p>
<h1 id="2-implementation">2. Implementation<a class="headerlink"
href="#2-implementation" title="Permanent link">¶</a></h1>
-<p>Before we start with the implementation, please have a look at the class
<code>myservice.mynamespace.data.Storage</code>. In difference to the <a
href="http://olingo.apache.org/doc/odata4/tutorials/navigation/tutorial_navigation.html">navigation
tutorial</a> the relations between two entities can not be hard coded because
we would like to create and change relations between entities. In the
constructor of the data storage the sample data is created. After that the
method <code>linkProductsAndCategories</code>is called. This methods sets a few
links between the just created entities.</p>
-<p>To express the relation between two entities, Olingo uses the class <a
href="http://olingo.apache.org/javadoc/odata4/org/apache/olingo/commons/api/data/Link.html">Link</a>.
This class is used for related entites (directly connected via Java
references) and bindings (which are actually strings) to other entities
dynamically. To get the related entites for a particual navigation property,
you can ask an entity with the method <a
href="http://olingo.apache.org/javadoc/odata4/org/apache/olingo/commons/api/data/Linked.html#getNavigationLink(java.lang.String)"><code>getNavigationLink(String
name)</code></a> for an navigation property. The link will contain either an
entity or a collection of entities dependenting on the type of the navigation
property. To get the actual entities use the methods <a
href="http://olingo.apache.org/javadoc/odata4/org/apache/olingo/commons/api/data/Link.html#getInlineEntity()"><code>getInlineEntity()</code></a>
or <a href="http://olingo.apache.org/javadoc/o
data4/org/apache/olingo/commons/api/data/Link.html#getInlineEntitySet()"><code>getInlineEntitySet()</code></a>
-The same can be done for bindings via the method <a
href="http://olingo.apache.org/javadoc/odata4/org/apache/olingo/commons/api/data/Linked.html#getNavigationBinding(java.lang.String)"><code>getNavigationBinding(String
name)</code></a>. The values of the Binding can be got by the methods <a
href="http://olingo.apache.org/javadoc/odata4/org/apache/olingo/commons/api/data/Link.html#getBindingLink()"><code>getBindingLink()</code></a>
and <a
href="http://olingo.apache.org/javadoc/odata4/org/apache/olingo/commons/api/data/Link.html#getBindingLinks()"><code>getBindingLinks()</code></a>.
</p>
+<p>Before we start with the implementation, please have a look at the class
<code>myservice.mynamespace.data.Storage</code>. In difference to the <a
href="http://olingo.apache.org/doc/odata4/tutorials/navigation/tutorial_navigation.html">navigation
tutorial</a> the relations between two entities can not be hard coded because
we would like to create and change relations between entities dynamically. In
the constructor of the data storage the sample data is created. After that the
method <code>linkProductsAndCategories</code>is called. This methods sets a few
links between the just created entities.</p>
+<p>To express the relation between two entities, Olingo uses the class <a
href="http://olingo.apache.org/javadoc/odata4/org/apache/olingo/commons/api/data/Link.html">Link</a>.
This class is used for related entites (directly connected via Java
references) and bindings (which are actually strings) to other entities. To get
the related entites for a particual navigation property, you can ask an entity
with the method <a
href="http://olingo.apache.org/javadoc/odata4/org/apache/olingo/commons/api/data/Linked.html#getNavigationLink(java.lang.String)"><code>getNavigationLink(String
name)</code></a> for an navigation property. The link will contain either an
entity or a collection of entities dependenting on the type of the navigation
property. To get the actual entities use the methods <a
href="http://olingo.apache.org/javadoc/odata4/org/apache/olingo/commons/api/data/Link.html#getInlineEntity()"><code>getInlineEntity()</code></a>
or <a href="http://olingo.apache.org/javadoc/odata4/org/ap
ache/olingo/commons/api/data/Link.html#getInlineEntitySet()"><code>getInlineEntitySet()</code></a>
+The same can be done for bindings via the method <a
href="http://olingo.apache.org/javadoc/odata4/org/apache/olingo/commons/api/data/Linked.html#getNavigationBinding(java.lang.String)"><code>getNavigationBinding(String
name)</code></a>. The values of the Binding can be gotten by the methods <a
href="http://olingo.apache.org/javadoc/odata4/org/apache/olingo/commons/api/data/Link.html#getBindingLink()"><code>getBindingLink()</code></a>
and <a
href="http://olingo.apache.org/javadoc/odata4/org/apache/olingo/commons/api/data/Link.html#getBindingLinks()"><code>getBindingLinks()</code></a>.
</p>
<p>The point is that the Entity deserializer uses the same concept to
represent the payload as Java objects.
In the previous tutorials the entity object returned by the deserializer is
passed to the data store. Please open the class
<code>myservice.mynamespace.data.Storage</code> and jump the method
<code>createEntity</code>.</p>
+<p>The implementation should look like the following:</p>
+<div class="codehilite"><pre><span class="kd">private</span> <span
class="n">Entity</span> <span class="nf">createEntity</span><span
class="o">(</span><span class="n">EdmEntitySet</span> <span
class="n">edmEntitySet</span><span class="o">,</span> <span
class="n">EdmEntityType</span> <span class="n">edmEntityType</span><span
class="o">,</span> <span class="n">Entity</span> <span
class="n">entity</span><span class="o">,</span>
+ <span class="n">List</span><span class="o"><</span><span
class="n">Entity</span><span class="o">></span> <span
class="n">entityList</span><span class="o">,</span> <span
class="kd">final</span> <span class="n">String</span> <span
class="n">rawServiceUri</span><span class="o">)</span> <span
class="kd">throws</span> <span class="n">ODataApplicationException</span> <span
class="o">{</span>
+
+ <span class="c1">// 1.) Create the entity</span>
+ <span class="kd">final</span> <span class="n">Entity</span> <span
class="n">newEntity</span> <span class="o">=</span> <span class="k">new</span>
<span class="n">Entity</span><span class="o">();</span>
+ <span class="n">newEntity</span><span class="o">.</span><span
class="na">setType</span><span class="o">(</span><span
class="n">entity</span><span class="o">.</span><span
class="na">getType</span><span class="o">());</span>
+
+ <span class="c1">// Create the new key of the entity</span>
+ <span class="kt">int</span> <span class="n">newId</span> <span
class="o">=</span> <span class="mi">1</span><span class="o">;</span>
+ <span class="k">while</span> <span class="o">(</span><span
class="n">entityIdExists</span><span class="o">(</span><span
class="n">newId</span><span class="o">,</span> <span
class="n">entityList</span><span class="o">))</span> <span class="o">{</span>
+ <span class="n">newId</span><span class="o">++;</span>
+ <span class="o">}</span>
+
+ <span class="c1">// Add all provided properties</span>
+ <span class="n">newEntity</span><span class="o">.</span><span
class="na">getProperties</span><span class="o">().</span><span
class="na">addAll</span><span class="o">(</span><span
class="n">entity</span><span class="o">.</span><span
class="na">getProperties</span><span class="o">());</span>
+
+ <span class="c1">// Add the key property</span>
+ <span class="n">newEntity</span><span class="o">.</span><span
class="na">getProperties</span><span class="o">().</span><span
class="na">add</span><span class="o">(</span><span class="k">new</span> <span
class="n">Property</span><span class="o">(</span><span
class="kc">null</span><span class="o">,</span> <span
class="s">"ID"</span><span class="o">,</span> <span
class="n">ValueType</span><span class="o">.</span><span
class="na">PRIMITIVE</span><span class="o">,</span> <span
class="n">newId</span><span class="o">));</span>
+ <span class="n">newEntity</span><span class="o">.</span><span
class="na">setId</span><span class="o">(</span><span
class="n">createId</span><span class="o">(</span><span
class="n">newEntity</span><span class="o">,</span> <span
class="s">"ID"</span><span class="o">));</span>
+
+ <span class="c1">// --> Implement Deep Insert handling here
<--</span>
+
+ <span class="n">entityList</span><span class="o">.</span><span
class="na">add</span><span class="o">(</span><span
class="n">newEntity</span><span class="o">);</span>
+ <span class="k">return</span> <span class="n">newEntity</span><span
class="o">;</span>
+<span class="o">}</span>
+</pre></div>
+
+
+<p>The implementation is split in two steps:
+ * Handle entity bindings
+ * Handle related entities</p>
+<h2 id="handle-entity-bindings">Handle entity bindings<a class="headerlink"
href="#handle-entity-bindings" title="Permanent link">¶</a></h2>
+<p>To handle entity bindings we need two helper methods.</p>
+<p>The first method takes an entity-Id and returns the addressed entity. The
OData objects provides a helper object to parse entity-ids. (See <a
href="http://olingo.apache.org/javadoc/odata4/org/apache/olingo/server/api/uri/UriHelper.html">UriHelper</a>).
After parsing the id we have to check if the addressed entity set fits to the
entity set the navigation property points to. After that the data is read by
calling <code>readEntityData</code>.</p>
+<div class="codehilite"><pre><span class="n">private</span> <span
class="n">Entity</span> <span class="n">readEntityByBindingLink</span><span
class="p">(</span><span class="n">final</span> <span class="n">String</span>
<span class="n">entityId</span><span class="p">,</span> <span
class="n">final</span> <span class="n">EdmEntitySet</span> <span
class="n">edmEntitySet</span><span class="p">,</span>
+ <span class="n">final</span> <span class="n">String</span> <span
class="n">rawServiceUri</span><span class="p">)</span> <span
class="n">throws</span> <span class="n">ODataApplicationException</span> <span
class="p">{</span>
+
+ <span class="n">UriResourceEntitySet</span> <span
class="n">entitySetResource</span> <span class="p">=</span> <span
class="n">null</span><span class="p">;</span>
+ <span class="k">try</span> <span class="p">{</span>
+ <span class="n">entitySetResource</span> <span class="p">=</span>
<span class="n">odata</span><span class="p">.</span><span
class="n">createUriHelper</span><span class="p">().</span><span
class="n">parseEntityId</span><span class="p">(</span><span
class="n">edm</span><span class="p">,</span> <span
class="n">entityId</span><span class="p">,</span> <span
class="n">rawServiceUri</span><span class="p">);</span>
+
+ <span class="k">if</span><span class="p">(</span>!<span
class="n">entitySetResource</span><span class="p">.</span><span
class="n">getEntitySet</span><span class="p">().</span><span
class="n">getName</span><span class="p">().</span><span
class="n">equals</span><span class="p">(</span><span
class="n">edmEntitySet</span><span class="p">.</span><span
class="n">getName</span><span class="p">()))</span> <span class="p">{</span>
+ <span class="n">throw</span> <span class="n">new</span> <span
class="n">ODataApplicationException</span><span class="p">(</span>"<span
class="n">Execpted</span> <span class="n">an</span> <span
class="n">entity</span><span class="o">-</span><span class="n">id</span> <span
class="k">for</span> <span class="n">entity</span> <span class="n">set</span>
" <span class="o">+</span> <span class="n">edmEntitySet</span><span
class="p">.</span><span class="n">getName</span><span class="p">()</span> <span
class="o">+</span>
+ " <span class="n">but</span> <span class="n">found</span>
<span class="n">id</span> <span class="k">for</span> <span
class="n">entity</span> <span class="n">set</span> " <span
class="o">+</span> <span class="n">entitySetResource</span><span
class="p">.</span><span class="n">getEntitySet</span><span
class="p">().</span><span class="n">getName</span><span class="p">(),</span>
+ <span class="n">HttpStatusCode</span><span
class="p">.</span><span class="n">BAD_REQUEST</span><span
class="p">.</span><span class="n">getStatusCode</span><span
class="p">(),</span> <span class="n">Locale</span><span class="p">.</span><span
class="n">ENGLISH</span><span class="p">);</span>
+ <span class="p">}</span>
+ <span class="p">}</span> <span class="k">catch</span> <span
class="p">(</span><span class="n">DeserializerException</span> <span
class="n">e</span><span class="p">)</span> <span class="p">{</span>
+ <span class="n">throw</span> <span class="n">new</span> <span
class="n">ODataApplicationException</span><span class="p">(</span><span
class="n">entityId</span> <span class="o">+</span> " <span
class="n">is</span> <span class="n">not</span> <span class="n">a</span> <span
class="n">valid</span> <span class="n">entity</span><span
class="o">-</span><span class="n">Id</span>"<span class="p">,</span>
+ <span class="n">HttpStatusCode</span><span class="p">.</span><span
class="n">BAD_REQUEST</span><span class="p">.</span><span
class="n">getStatusCode</span><span class="p">(),</span> <span
class="n">Locale</span><span class="p">.</span><span
class="n">ENGLISH</span><span class="p">);</span>
+ <span class="p">}</span>
+
+ <span class="k">return</span> <span class="n">readEntityData</span><span
class="p">(</span><span class="n">entitySetResource</span><span
class="p">.</span><span class="n">getEntitySet</span><span class="p">(),</span>
<span class="n">entitySetResource</span><span class="p">.</span><span
class="n">getKeyPredicates</span><span class="p">());</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>The second method helps us to link entities together. If the navigation
property has partner navigation property the link is set in both directions.</p>
+<div class="codehilite"><pre><span class="n">private</span> <span
class="n">void</span> <span class="n">createLink</span><span
class="p">(</span><span class="n">final</span> <span
class="n">EdmNavigationProperty</span> <span
class="n">navigationProperty</span><span class="p">,</span> <span
class="n">final</span> <span class="n">Entity</span> <span
class="n">srcEntity</span><span class="p">,</span>
+ <span class="n">final</span> <span class="n">Entity</span> <span
class="n">destEntity</span><span class="p">)</span> <span class="p">{</span>
+
+ <span class="n">setLink</span><span class="p">(</span><span
class="n">navigationProperty</span><span class="p">,</span> <span
class="n">srcEntity</span><span class="p">,</span> <span
class="n">destEntity</span><span class="p">);</span>
+
+ <span class="n">final</span> <span class="n">EdmNavigationProperty</span>
<span class="n">partnerNavigationProperty</span> <span class="p">=</span> <span
class="n">navigationProperty</span><span class="p">.</span><span
class="n">getPartner</span><span class="p">();</span>
+ <span class="k">if</span> <span class="p">(</span><span
class="n">partnerNavigationProperty</span> !<span class="p">=</span> <span
class="n">null</span><span class="p">)</span> <span class="p">{</span>
+ <span class="n">setLink</span><span class="p">(</span><span
class="n">partnerNavigationProperty</span><span class="p">,</span> <span
class="n">destEntity</span><span class="p">,</span> <span
class="n">srcEntity</span><span class="p">);</span>
+ <span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>If the client has used the <code>odata.bind</code> property annotation, we
can get the bindings by calling <code>getNavigationBindings()</code>. The
implementation loops over all bindings and links the addressed entity to the
new created one.</p>
+<div class="codehilite"><pre><span class="c1">// 2.1.) Apply binding
links</span>
+<span class="k">for</span><span class="p">(</span><span class="k">final</span>
<span class="n">Link</span> <span class="n">link</span> <span
class="o">:</span> <span class="n">entity</span><span class="p">.</span><span
class="n">getNavigationBindings</span><span class="p">())</span> <span
class="p">{</span>
+ <span class="k">final</span> <span class="n">EdmNavigationProperty</span>
<span class="n">edmNavigationProperty</span> <span class="o">=</span> <span
class="n">edmEntityType</span><span class="p">.</span><span
class="n">getNavigationProperty</span><span class="p">(</span><span
class="n">link</span><span class="p">.</span><span
class="n">getTitle</span><span class="p">());</span>
+ <span class="k">final</span> <span class="n">EdmEntitySet</span> <span
class="n">targetEntitySet</span> <span class="o">=</span> <span
class="p">(</span><span class="n">EdmEntitySet</span><span class="p">)</span>
<span class="n">edmEntitySet</span><span class="p">.</span><span
class="n">getRelatedBindingTarget</span><span class="p">(</span><span
class="n">link</span><span class="p">.</span><span
class="n">getTitle</span><span class="p">());</span>
+
+ <span class="k">if</span><span class="p">(</span><span
class="n">edmNavigationProperty</span><span class="p">.</span><span
class="n">isCollection</span><span class="p">()</span> <span
class="o">&&</span> <span class="n">link</span><span
class="p">.</span><span class="n">getBindingLinks</span><span
class="p">()</span> <span class="o">!=</span> <span class="k">null</span><span
class="p">)</span> <span class="p">{</span>
+ <span class="k">for</span><span class="p">(</span><span
class="k">final</span> <span class="n">String</span> <span
class="n">bindingLink</span> <span class="o">:</span> <span
class="n">link</span><span class="p">.</span><span
class="n">getBindingLinks</span><span class="p">())</span> <span
class="p">{</span>
+ <span class="k">final</span> <span class="n">Entity</span> <span
class="n">relatedEntity</span> <span class="o">=</span> <span
class="n">readEntityByBindingLink</span><span class="p">(</span><span
class="n">bindingLink</span><span class="p">,</span> <span
class="n">targetEntitySet</span><span class="p">,</span> <span
class="n">rawServiceUri</span><span class="p">);</span>
+ <span class="n">createLink</span><span class="p">(</span><span
class="n">edmNavigationProperty</span><span class="p">,</span> <span
class="n">newEntity</span><span class="p">,</span> <span
class="n">relatedEntity</span><span class="p">);</span>
+ <span class="p">}</span>
+ <span class="p">}</span> <span class="k">else</span> <span
class="k">if</span><span class="p">(</span><span class="o">!</span><span
class="n">edmNavigationProperty</span><span class="p">.</span><span
class="n">isCollection</span><span class="p">()</span> <span
class="o">&&</span> <span class="n">link</span><span
class="p">.</span><span class="n">getBindingLink</span><span
class="p">()</span> <span class="o">!=</span> <span class="k">null</span><span
class="p">)</span> <span class="p">{</span>
+ <span class="k">final</span> <span class="n">Entity</span> <span
class="n">relatedEntity</span> <span class="o">=</span> <span
class="n">readEntityByBindingLink</span><span class="p">(</span><span
class="n">link</span><span class="p">.</span><span
class="n">getBindingLink</span><span class="p">(),</span> <span
class="n">targetEntitySet</span><span class="p">,</span> <span
class="n">rawServiceUri</span><span class="p">);</span>
+ <span class="n">createLink</span><span class="p">(</span><span
class="n">edmNavigationProperty</span><span class="p">,</span> <span
class="n">newEntity</span><span class="p">,</span> <span
class="n">relatedEntity</span><span class="p">);</span>
+ <span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<h2 id="handle-related-entities">Handle related entities<a class="headerlink"
href="#handle-related-entities" title="Permanent link">¶</a></h2>
+<p>The creation of related entities is similar. First the implementation loops
over all navigation properties with related entites in the payload. The
simplest way to create releated entities is to call the method
<code>createEntityData</code>. So the the implementation is called recursively
and can handle deep inserts with arbitrary depth.</p>
+<div class="codehilite"><pre><span class="c1">// 2.2.) Create nested
entities</span>
+<span class="k">for</span><span class="p">(</span><span class="k">final</span>
<span class="n">Link</span> <span class="n">link</span> <span
class="o">:</span> <span class="n">entity</span><span class="p">.</span><span
class="n">getNavigationLinks</span><span class="p">())</span> <span
class="p">{</span>
+ <span class="k">final</span> <span class="n">EdmNavigationProperty</span>
<span class="n">edmNavigationProperty</span> <span class="o">=</span> <span
class="n">edmEntityType</span><span class="p">.</span><span
class="n">getNavigationProperty</span><span class="p">(</span><span
class="n">link</span><span class="p">.</span><span
class="n">getTitle</span><span class="p">());</span>
+ <span class="k">final</span> <span class="n">EdmEntitySet</span> <span
class="n">targetEntitySet</span> <span class="o">=</span> <span
class="p">(</span><span class="n">EdmEntitySet</span><span class="p">)</span>
<span class="n">edmEntitySet</span><span class="p">.</span><span
class="n">getRelatedBindingTarget</span><span class="p">(</span><span
class="n">link</span><span class="p">.</span><span
class="n">getTitle</span><span class="p">());</span>
+
+ <span class="k">if</span><span class="p">(</span><span
class="n">edmNavigationProperty</span><span class="p">.</span><span
class="n">isCollection</span><span class="p">()</span> <span
class="o">&&</span> <span class="n">link</span><span
class="p">.</span><span class="n">getInlineEntitySet</span><span
class="p">()</span> <span class="o">!=</span> <span class="k">null</span><span
class="p">)</span> <span class="p">{</span>
+ <span class="k">for</span><span class="p">(</span><span
class="k">final</span> <span class="n">Entity</span> <span
class="n">nestedEntity</span> <span class="o">:</span> <span
class="n">link</span><span class="p">.</span><span
class="n">getInlineEntitySet</span><span class="p">().</span><span
class="n">getEntities</span><span class="p">())</span> <span class="p">{</span>
+ <span class="k">final</span> <span class="n">Entity</span> <span
class="n">newNestedEntity</span> <span class="o">=</span> <span
class="n">createEntityData</span><span class="p">(</span><span
class="n">targetEntitySet</span><span class="p">,</span> <span
class="n">nestedEntity</span><span class="p">,</span> <span
class="n">rawServiceUri</span><span class="p">);</span>
+ <span class="n">createLink</span><span class="p">(</span><span
class="n">edmNavigationProperty</span><span class="p">,</span> <span
class="n">newEntity</span><span class="p">,</span> <span
class="n">newNestedEntity</span><span class="p">);</span>
+ <span class="p">}</span>
+ <span class="p">}</span> <span class="k">else</span> <span
class="k">if</span><span class="p">(</span><span class="o">!</span><span
class="n">edmNavigationProperty</span><span class="p">.</span><span
class="n">isCollection</span><span class="p">()</span> <span
class="o">&&</span> <span class="n">link</span><span
class="p">.</span><span class="n">getInlineEntity</span><span
class="p">()</span> <span class="o">!=</span> <span class="k">null</span><span
class="p">){</span>
+ <span class="k">final</span> <span class="n">Entity</span> <span
class="n">newNestedEntity</span> <span class="o">=</span> <span
class="n">createEntityData</span><span class="p">(</span><span
class="n">targetEntitySet</span><span class="p">,</span> <span
class="n">link</span><span class="p">.</span><span
class="n">getInlineEntity</span><span class="p">(),</span> <span
class="n">rawServiceUri</span><span class="p">);</span>
+ <span class="n">createLink</span><span class="p">(</span><span
class="n">edmNavigationProperty</span><span class="p">,</span> <span
class="n">newEntity</span><span class="p">,</span> <span
class="n">newNestedEntity</span><span class="p">);</span>
+ <span class="p">}</span>
+<span class="p">}</span>
+</pre></div>
+
+
<h1 id="4-run-the-implemented-service">4. Run the implemented service<a
class="headerlink" href="#4-run-the-implemented-service" title="Permanent
link">¶</a></h1>
<p>After building and deploying your service to your server, you can try the
following requests:</p>
+<p>URI: <a
href="http://localhost:8080/DemoService-DeepInsert/DemoService.svc/Categories"><code>http://localhost:8080/DemoService-DeepInsert/DemoService.svc/Categories</code></a>
<br />
+Http-Verb: POST <br />
+Content-Type: application/json
+Body:</p>
+<div class="codehilite"><pre><span class="p">{</span>
+ "<span class="n">name</span>"<span class="p">:</span>
"<span class="n">Food</span>"<span class="p">,</span>
+ "<span class="n">Products</span><span class="p">@</span><span
class="n">odata</span><span class="p">.</span><span
class="n">bind</span>"<span class="p">:</span> <span class="p">[</span>
+ "<span class="n">Products</span><span class="p">(</span>5<span
class="p">)</span>"
+ <span class="p">],</span>
+ "<span class="n">Products</span>"<span class="p">:</span> <span
class="p">[</span>
+ <span class="p">{</span>
+ "<span class="n">Name</span>"<span class="p">:</span>
"<span class="n">Bread</span>"<span class="p">,</span>
+ "<span class="n">Description</span>"<span
class="p">:</span> "<span class="n">Whole</span> <span
class="n">grain</span> <span class="n">bread</span>"
+ <span class="p">},</span>
+ <span class="p">{</span>
+ "<span class="n">Name</span>"<span class="p">:</span>
"<span class="n">Milk</span>"<span class="p">,</span>
+ "<span class="n">Description</span>"<span
class="p">:</span> "<span class="n">Low</span> <span class="n">fat</span>
<span class="n">milk</span>"
+ <span class="p">}</span>
+ <span class="p">]</span>
+<span class="p">}</span>
+</pre></div>
+
+
+<p>After sending this requests, let us see if the enties have been created and
linked togetger.
+Send an GET request to
<code>http://localhost:8080/DemoService-DeepInsert/DemoService.svc/Categories</code>.
+If it is the first category you created. The new entity should have the key
<code>3</code></p>
+<p><img alt="Entity Set Categories" src="categories_entity_set.png" /></p>
+<p>So send a request to fetch all related products for the "Food" category.
+<a
href=""><code>http://localhost:8080/DemoService-DeepInsert/DemoService.svc/Categories(3)/Products</code></a></p>
+<p>As you can see the two products are created and linked to the category.</p>
+<p><img alt="Related products for category "Food""
src="related_products.PNG" /></p>
<h1 id="5-links">5. Links<a class="headerlink" href="#5-links"
title="Permanent link">¶</a></h1>
<h3 id="tutorials">Tutorials<a class="headerlink" href="#tutorials"
title="Permanent link">¶</a></h3>
<p>Further topics to be covered by follow-up tutorials:</p>