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.
Acerca de esta tarea
Debe crear cuatro clases JAVA. Éstas son las correlaciones para el ObjectGrid:
- OrderBean.java
- OrderLineBean.java
- CustomerBean.java
- ItemBean.java
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.
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
- 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;
}
- 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();
}
}
- 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>