1<?xml version="1.0" encoding="UTF-8" standalone="no"?> 2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 3<html xmlns="http://www.w3.org/1999/xhtml"> 4 <head> 5 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 6 <title> 7 Creating Entity Bindings 8 </title> 9 <link rel="stylesheet" href="gettingStarted.css" type="text/css" /> 10 <meta name="generator" content="DocBook XSL Stylesheets V1.62.4" /> 11 <link rel="home" href="index.html" title="Berkeley DB Collections Tutorial" /> 12 <link rel="up" href="Entity.html" title="Chapter��4.�� Using Entity Classes	 	" /> 13 <link rel="previous" href="Entity.html" title="Chapter��4.�� Using Entity Classes	 	" /> 14 <link rel="next" href="collectionswithentities.html" title=" 		Creating Collections with Entity Bindings 	" /> 15 </head> 16 <body> 17 <div class="navheader"> 18 <table width="100%" summary="Navigation header"> 19 <tr> 20 <th colspan="3" align="center"> 21 Creating Entity Bindings 22 </th> 23 </tr> 24 <tr> 25 <td width="20%" align="left"><a accesskey="p" href="Entity.html">Prev</a>��</td> 26 <th width="60%" align="center">Chapter��4.�� 27 Using Entity Classes 28 </th> 29 <td width="20%" align="right">��<a accesskey="n" href="collectionswithentities.html">Next</a></td> 30 </tr> 31 </table> 32 <hr /> 33 </div> 34 <div class="sect1" lang="en" xml:lang="en"> 35 <div class="titlepage"> 36 <div> 37 <div> 38 <h2 class="title" style="clear: both"><a id="creatingentitybindings"></a> 39 Creating Entity Bindings 40 </h2> 41 </div> 42 </div> 43 <div></div> 44 </div> 45 <p> 46 <span class="emphasis"><em>Entity bindings</em></span> are similar to ordinary bindings in that 47 they convert between Java objects and the stored data format of 48 keys and values. In addition, entity bindings map between key/value 49 pairs and entity objects. An ordinary binding is a one-to-one 50 mapping, while an entity binding is a two-to-one mapping. 51</p> 52 <p> 53 The <tt class="literal">partValueBinding</tt>, <tt class="literal">supplierValueBinding</tt> and 54 <tt class="literal">shipmentValueBinding</tt> bindings are created below as entity 55 bindings rather than (in the prior examples) serial bindings. 56</p> 57 <a id="entity_sampleviews"></a> 58 <pre class="programlisting">import com.sleepycat.bind.EntryBinding; 59<b class="userinput"><tt>import com.sleepycat.bind.EntityBinding;</tt></b> 60import com.sleepycat.bind.serial.SerialBinding; 61<b class="userinput"><tt>import com.sleepycat.bind.serial.SerialSerialBinding;</tt></b> 62... 63 64public class SampleViews 65{ 66 ... 67 public SampleViews(SampleDatabase db) 68 { 69 ClassCatalog catalog = db.getClassCatalog(); 70 SerialBinding partKeyBinding = 71 new SerialBinding(catalog, PartKey.class); 72<b class="userinput"><tt> EntityBinding partValueBinding = 73 new PartBinding(catalog, PartKey.class, PartData.class);</tt></b> 74 SerialBinding supplierKeyBinding = 75 new SerialBinding(catalog, SupplierKey.class); 76<b class="userinput"><tt> EntityBinding supplierValueBinding = 77 new SupplierBinding(catalog, SupplierKey.class, 78 SupplierData.class);</tt></b> 79 SerialBinding shipmentKeyBinding = 80 new SerialBinding(catalog, ShipmentKey.class); 81<b class="userinput"><tt> EntityBinding shipmentValueBinding = 82 new ShipmentBinding(catalog, ShipmentKey.class, 83 ShipmentData.class);</tt></b> 84 SerialBinding cityKeyBinding = 85 new SerialBinding(catalog, String.class); 86 ... 87 } 88} </pre> 89 <p> 90 The entity bindings will be used in the next section to 91 construct stored map objects. 92</p> 93 <p> 94 The <tt class="classname">PartBinding</tt> class is defined below. 95</p> 96 <a id="entity_partbinding"></a> 97 <pre class="programlisting">public class SampleViews 98{ 99 ... 100<b class="userinput"><tt> private static class PartBinding extends SerialSerialBinding { 101 private PartBinding(ClassCatalog classCatalog, 102 Class keyClass, 103 Class dataClass) 104 { 105 super(classCatalog, keyClass, dataClass); 106 } 107 108 public Object entryToObject(Object keyInput, Object dataInput) 109 { 110 PartKey key = (PartKey) keyInput; 111 PartData data = (PartData) dataInput; 112 return new Part(key.getNumber(), data.getName(), data.getColor(), 113 data.getWeight(), data.getCity()); 114 } 115 116 public Object objectToKey(Object object) 117 { 118 Part part = (Part) object; 119 return new PartKey(part.getNumber()); 120 } 121 122 public Object objectToData(Object object) 123 { 124 Part part = (Part) object; 125 return new PartData(part.getName(), part.getColor(), 126 part.getWeight(), part.getCity()); 127 } 128 }</tt></b> 129 ... 130} </pre> 131 <p> 132 In general, an entity binding is any class that implements the 133 <a href="../../java/com/sleepycat/bind/EntityBinding.html" target="_top">EntityBinding</a> 134 135 interface, just as an ordinary binding is any class that implements 136 the 137 <a href="../../java/com/sleepycat/bind/EntryBinding.html" target="_top">EntryBinding</a> 138 139 interface. In the prior examples the built-in 140 <a href="../../java/com/sleepycat/bind/serial/SerialBinding.html" target="_top">SerialBinding</a> 141 142 class (which implements 143 <a href="../../java/com/sleepycat/bind/EntryBinding.html" target="_top">EntryBinding</a>) 144 was used and no application-defined binding classes were needed. 145</p> 146 <p> 147 In this example, application-defined binding classes are used 148 that extend the 149 <a href="../../java/com/sleepycat/bind/serial/SerialSerialBinding.html" target="_top">SerialSerialBinding</a> 150 151 abstract base class. This base class implements 152 <a href="../../java/com/sleepycat/bind/EntityBinding.html" target="_top">EntityBinding</a> 153 154 and provides the conversions between key/value bytes and key/value 155 objects, just as the 156 <a href="../../java/com/sleepycat/bind/serial/SerialBinding.html" target="_top">SerialBinding</a> 157 158 class does. The application-defined entity class implements the 159 abstract methods defined in the base class that map between 160 key/value objects and entity objects. 161</p> 162 <p> 163 Three abstract methods are implemented for each entity binding. 164 The <tt class="methodname">entryToObject()</tt> method takes as input the key and data 165 objects, which have been deserialized automatically by the base 166 class. As output, it returns the combined <tt class="classname">Part</tt> entity. 167</p> 168 <p> 169 The <tt class="methodname">objectToKey()</tt> and <tt class="methodname">objectToData()</tt> methods take an 170 entity object as input. As output they return the part key or data 171 object that is extracted from the entity object. The key or data 172 will then be serialized automatically by the base class. 173</p> 174 <p> 175 The <tt class="classname">SupplierBinding</tt> and <tt class="classname">ShipmentBinding</tt> classes 176 are very similar to the <tt class="classname">PartBinding</tt> class. 177</p> 178 <a id="entity_supplierbinding"></a> 179 <pre class="programlisting">public class SampleViews 180{ 181 ... 182<b class="userinput"><tt> private static class SupplierBinding extends SerialSerialBinding { 183 private SupplierBinding(ClassCatalog classCatalog, 184 Class keyClass, 185 Class dataClass) 186 { 187 super(classCatalog, keyClass, dataClass); 188 } 189 190 public Object entryToObject(Object keyInput, Object dataInput) 191 { 192 SupplierKey key = (SupplierKey) keyInput; 193 SupplierData data = (SupplierData) dataInput; 194 return new Supplier(key.getNumber(), data.getName(), 195 data.getStatus(), data.getCity()); 196 } 197 198 public Object objectToKey(Object object) 199 { 200 Supplier supplier = (Supplier) object; 201 return new SupplierKey(supplier.getNumber()); 202 } 203 204 public Object objectToData(Object object) 205 { 206 Supplier supplier = (Supplier) object; 207 return new SupplierData(supplier.getName(), supplier.getStatus(), 208 supplier.getCity()); 209 } 210 } 211 212 private static class ShipmentBinding extends SerialSerialBinding { 213 private ShipmentBinding(ClassCatalog classCatalog, 214 Class keyClass, 215 Class dataClass) 216 { 217 super(classCatalog, keyClass, dataClass); 218 } 219 220 public Object entryToObject(Object keyInput, Object dataInput) 221 { 222 ShipmentKey key = (ShipmentKey) keyInput; 223 ShipmentData data = (ShipmentData) dataInput; 224 return new Shipment(key.getPartNumber(), key.getSupplierNumber(), 225 data.getQuantity()); 226 } 227 228 public Object objectToKey(Object object) 229 { 230 Shipment shipment = (Shipment) object; 231 return new ShipmentKey(shipment.getPartNumber(), 232 shipment.getSupplierNumber()); 233 } 234 235 public Object objectToData(Object object) 236 { 237 Shipment shipment = (Shipment) object; 238 return new ShipmentData(shipment.getQuantity()); 239 } 240 }</tt></b> 241 ... 242} </pre> 243 </div> 244 <div class="navfooter"> 245 <hr /> 246 <table width="100%" summary="Navigation footer"> 247 <tr> 248 <td width="40%" align="left"><a accesskey="p" href="Entity.html">Prev</a>��</td> 249 <td width="20%" align="center"> 250 <a accesskey="u" href="Entity.html">Up</a> 251 </td> 252 <td width="40%" align="right">��<a accesskey="n" href="collectionswithentities.html">Next</a></td> 253 </tr> 254 <tr> 255 <td width="40%" align="left" valign="top">Chapter��4.�� 256 Using Entity Classes 257 ��</td> 258 <td width="20%" align="center"> 259 <a accesskey="h" href="index.html">Home</a> 260 </td> 261 <td width="40%" align="right" valign="top">�� 262 Creating Collections with Entity Bindings 263 </td> 264 </tr> 265 </table> 266 </div> 267 </body> 268</html> 269