Lernprogramm zu ObjectQuery - Schritt 4

Im folgenden Schritt wird demonstriert, wie Sie ein ObjectGrid mit vier Maps und ein Schema für diese Maps erstellen. Einige Maps verwalten eine Eins-zu-eins- (unidirektional) und eine Eins-zu-viele-Beziehung (bidirektional). Nach dem Erstellen der Maps können Sie das Beispielprogramm Application.java ausführen, um Objekte in den Cache einzufügen und Abfragen zum Abrufen dieser Objekte abzurufen.

Vorbereitende Schritte

Stellen Sie sicher, dass Sie die Anweisungen im Abschnitt Lernprogramm zu ObjectQuery - Schritt 3 ausgeführt haben, bevor Sie mit diesem Schritt fortfahren.

Informationen zu diesem Vorgang

Sie müssen vier Java-Klassen erstellen. Diese Klassen sind die Maps für das ObjectGrid:
Abbildung 1. Bestellungsschema. Ein Bestellungsschema (Order) hat eine Eins-zu-eins-Beziehung mit einem Kunden (Customer) und eine Eins-zu-viele-Beziehung mit Bestellpositionen (OrderLine). Die Map "OrderLine" hat eine Eins-zu-eins-Beziehung mit einem Artikel (Item) und enthält die bestellte Menge.
Entitätsschema Order
Nach der Erstellung dieser Java-Klassen mit diesen Beziehungen können Sie das Beispielprogramm Application.java ausführen. Mit diesem Programm können Sie Objekte in den Cache einfügen und diese mit verschiedenen Abfragen abrufen.

Vorgehensweise

  1. Erstellen Sie die folgenden Java-Klassen:
    OrderBean.java
    
    public class OrderBean implements Serializable {
       String orderNumber;
       java.util.Date date;
       String customerId;
       String itemName;
       List<Integer> orderLines;
    }
        
    OrderLineBean.java
    
    public class OrderLineBean implements Serializable {
    	 int lineNumber;
    int quantity;
    String orderNumber;
    	 String itemId;
    }
    CustomerBean.java
    
    public class CustomerBean implements Serializable{
      String id;
      String firstName;
      String surname;
      String address;
      String phoneNumber;
    }
    ItemBean.java
    
    public class ItemBean implements Serializable {
    	 String id; 	
    	 String description; 	
    	 long quantityOnHand; 	
    double price;
    }
  2. Nach der Erstellung dieser Klassen können Sie das Beispielprogramm Application.java ausführen:
    Application.java
    
    
    		public class Application static public void main(String [] args)throws Exception
            // Über das Programm konfigurieren
     				objectGrid og = ObjectGridManagerFactory.getObjectGridManager().createObjectGrid();
            og.defineMap("Order");
            og.defineMap("Customer");
            og.defineMap("OrderLine");
            og.defineMap("Item");
    
            // Schema definieren
            QueryConfig queryCfg = new QueryConfig();
            queryCfg.addQueryMapping(new QueryMapping("Order", OrderBean.class.getName(), "orderNumber", QueryMapping.FIELD_ACCESS));
            queryCfg.addQueryMapping(new QueryMapping("Customer", CustomerBean.class.getName(), "id", QueryMapping.FIELD_ACCESS));
            queryCfg.addQueryMapping(new QueryMapping("OrderLine", OrderLineBean.class.getName(), "lineNumber", QueryMapping.FIELD_ACCESS));
            queryCfg.addQueryMapping(new QueryMapping("Item", ItemBean.class.getName(), "id", QueryMapping.FIELD_ACCESS));
            queryCfg.addQueryRelationship(new QueryRelationship(OrderBean.class.getName(), CustomerBean.class.getName(), "customerId", null));
            queryCfg.addQueryRelationship(new QueryRelationship(OrderBean.class.getName(), OrderLineBean.class.getName(), 
    				"orderLines", "lineNumber"));
            queryCfg.addQueryRelationship(new QueryRelationship(OrderLineBean.class.getName(), ItemBean.class.getName(), "itemId", null));
            og.setQueryConfig(queryCfg);
    
            // Sitzung und Maps abrufen;
            Session s = og.getSession();
            ObjectMap orderMap = s.getMap("Order");
            ObjectMap custMap = s.getMap("Customer");
            ObjectMap itemMap = s.getMap("Item");
            ObjectMap orderLineMap = s.getMap("OrderLine");
    
            // Daten hinzufügen
            s.begin();
            CustomerBean aCustomer = new CustomerBean();
            aCustomer.address = "Main Street";
            aCustomer.firstName = "John";
            aCustomer.surname = "Smith";
            aCustomer.id = "C001";
            aCustomer.phoneNumber = "5555551212";
            custMap.insert(aCustomer.id, aCustomer);
    
            // Bestellung mit einer Referenz auf den Kunden, aber noch ohne OrderLines einfügen.
            // Da CopyMode.COPY_ON_READ_AND_COMMIT verwendet wird, wird das insert
            // erst bei der Festschreibung in die BackingMap kopiert, und deshalb
            // ist die Referenz weiterhin in Ordnung.
    				
    				OrderBean anOrder = new OrderBean();
    				anOrder.customerId = aCustomer.id;
    				anOrder.date = new java.util.Date();
    				anOrder.itemName = "Widget";
    				anOrder.orderNumber = "1";
    				anOrder.orderLines = new ArrayList();
    				orderMap.insert(anOrder.orderNumber, anOrder);
    				        
            ItemBean anItem = new ItemBean();
            anItem.id = "AC0001";
            anItem.description = "Description of widget";
            anItem.quantityOnHand = 100;
            anItem.price = 1000.0;
            itemMap.insert(anItem.id, anItem);
    
    				// OrderLines erstellen und die Referenz der Order hinzufügen
            OrderLineBean anOrderLine = new OrderLineBean();
            anOrderLine.lineNumber = 99;
            anOrderLine.itemId = anItem.id;
            anOrderLine.orderNumber = anOrder.orderNumber;
            anOrderLine.quantity = 500;
            orderLineMap.insert(anOrderLine.lineNumber, anOrderLine);
            anOrder.orderLines.add(Integer.valueOf(anOrderLine.lineNumber));
    
    				anOrderLine = new OrderLineBean();
            anOrderLine.lineNumber = 100;
            anOrderLine.itemId = anItem.id;
            anOrderLine.orderNumber = anOrder.orderNumber;
            anOrderLine.quantity = 501;
            orderLineMap.insert(anOrderLine.lineNumber, anOrderLine);
            anOrder.orderLines.add(Integer.valueOf(anOrderLine.lineNumber));
            s.commit();
    
    s.begin();
            // Alle Kunden suchen, die einen bestimmten Artikel bestellt haben.
            ObjectQuery query = s.createObjectQuery("SELECT c FROM Order o JOIN o.customerId as c WHERE o.itemName='Widget'");
            Iterator result = query.getResultIterator();
            aCustomer = (CustomerBean) result.next();
            System.out.println("Found order for customer: " + aCustomer.firstName + " " + aCustomer.surname);
            s.commit();
    
    s.begin();
            // Alle OrderLines für den Kunden C001 suchen.
            // Die Abfrage-Joins werden in den Fremdschlüssel formuliert.
            query = s.createObjectQuery("SELECT ol FROM Order o JOIN o.customerId as c JOIN o.orderLines as ol WHERE c.id='C001'");
            result = query.getResultIterator();
            System.out.println("Found OrderLines:");
            while(result.hasNext()) {
                anOrderLine = (OrderLineBean) result.next();
                System.out.println(anOrderLine.lineNumber + ", qty=" + anOrderLine.quantity);
            }
    	// Sitzung schließen (optional in Version 7.1.1 und höher), um die Leistung zu verbessern
    	s.close();   
     		}
    }
  3. Die folgende XML-Konfiguration (im ObjectGrid-Implementierungsdeskriptor) entspricht funktional dem zuvor beschriebenen programmgesteuerten Ansatz.
    <?xml version="1.0" encoding="UTF-8"?><objectGridConfig xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://ibm.com/ws/objectgrid/config
    ../objectGrid.xsd"xmlns="http://ibm.com/ws/objectgrid/config">
    <objectGrids>
    <objectGrid name="CompanyGrid">
      <backingMap name="Order"/>
      <backingMap name="Customer"/>
    
            			<backingMap name="OrderLine" />
      			<backingMap name="Item" />
    
    <querySchema>
     <mapSchemas>
      <mapSchema
    mapName="Order"
    valueClass="com.mycompany.OrderBean"
    primaryKeyField="orderNumber"
    						accessType="FIELD"/>
      <mapSchema
    mapName="Customer"
    valueClass="com.mycompany.CustomerBean"
    primaryKeyField="id"
    						accessType="FIELD"/>
      <mapSchema
    		mapName="OrderLine"
    		valueClass="com.mycompany.OrderLineBean"
    		primaryKeyField="
    		lineNumber"
    						accessType="FIELD"/>
      <mapSchema
    		mapName="Item"
    		valueClass="com.mycompany.ItemBean"
    		primaryKeyField="id"
    						accessType="FIELD"/>
      </mapSchemas>
    
    <relationships>
    	<relationship
    source="com.mycompany.OrderBean"
    target="com.mycompany.CustomerBean"
    relationField="customerId"/>
    	<relationship
    source="com.mycompany.OrderBean"
    		target="com.mycompany.OrderLineBean"
    		relationField="orderLines"
    		invRelationField="lineNumber"/>
    	<relationship
    		source="com.mycompany.OrderLineBean"
    		target="com.mycompany.ItemBean"
    		relationField="itemId"/>
        </relationships>
       </querySchema>
      </objectGrid>
     </objectGrids>
    </objectGridConfig>