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.
Informationen zu diesem Vorgang
Sie müssen vier Java-Klassen erstellen. Diese Klassen sind die Maps für das
ObjectGrid:
- OrderBean.java
- OrderLineBean.java
- CustomerBean.java
- ItemBean.java
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.
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
- 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;
}
- 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();
}
}
- 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>