Guía de aprendizaje de ObjectQuery - Paso 4

El siguiente paso muestra cómo crear un ObjectGrid con cuatro correlaciones y un esquema para las correlaciones. Algunas de las correlaciones mantienen una relación de uno a uno (unidireccional) y de uno a muchos (bidireccional). Después de crear las correlaciones, puede ejecutar el programa de ejemplo Application.java para insertar objetos en la memoria caché y ejecutar consultas para recuperar dichos objetos.

Antes de empezar

Asegúrese de haber completado el apartado Guía de aprendizaje de ObjectQuery - Paso 3 antes de continuar con el paso actual.

Acerca de esta tarea

Debe crear cuatro clases JAVA. Éstas son las correlaciones para el ObjectGrid:
Figura 1. Esquema Order. Un esquema Order tiene una relación de uno a uno con Customer y una relación de uno a muchos con OrderLine. La correlación OrderLine tiene una relación de uno a uno con Item e incluye la cantidad solicitada.
Esquema de entidades Order
Después de crear estas clases JAVA con estas relaciones, puede ejecutar el programa de ejemplo Application.java. Este programa le permite insertar objetos en la memoria caché y recuperarlos utilizando varias consultas.

Procedimiento

  1. Cree las siguientes clases JAVA:
    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. Después de crear las clases, puede ejecutar el ejemplo Application.java:
    Application.java
    
    
    		public class Application static public void main(String [] args)throws Exception
            // Configurar de forma programática
     				objectGrid og = ObjectGridManagerFactory.getObjectGridManager().createObjectGrid();
            og.defineMap("Order");
            og.defineMap("Customer");
            og.defineMap("OrderLine");
            og.defineMap("Item");
    
            // Definir el esquema
            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);
    
            // Obtener sesión y correlaciones;
            Session s = og.getSession();
            ObjectMap orderMap = s.getMap("Order");
            ObjectMap custMap = s.getMap("Customer");
            ObjectMap itemMap = s.getMap("Item");
            ObjectMap orderLineMap = s.getMap("OrderLine");
    
            // Añadir datos
            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);
    
            // Insertar un pedido con una referencia al cliente, pero todavía sin OrderLines.
            // Como estamos utilizando CopyMode.COPY_ON_READ_AND_COMMIT, la
            // inserción no se copiará en la correlación de respaldo hasta el momento confirmado,
            // de modo que la referencia sigue siendo correcta.
    				
    				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);
    
    				// Crear las OrderLines y añadir la referencia a Order
            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();
            // Buscar todos los clientes que han solicitado un artículo específico.
            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();
            // Buscar todas las OrderLines del cliente C001.
            // Las uniones de consultas se expresan en las claves foráneas.
            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);
            }
    // Cierre la sesión (opcional en la versión 7.1.1 y posterior) para un mejor rendimiento
    	s.close();   
     		}
    }
  3. El uso de la configuración XML siguiente (en el descriptor de despliegue de ObjectGrid) es equivalente al enfoque programático anterior.
    <?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>