With the following step, you can create an ObjectGrid with two maps and a schema for the maps with a relationship, then insert objects into the cache and later retrieve them using a simple query.
OrderBean.java public class OrderBean implements Serializable { String orderNumber; java.util.Date date; String customerId; String itemName; int quantity; double price; }The OrderBean no longer has the customerName in it. Instead, it has the customerId, which is the primary key for the CustomerBean object and the Customer map.
CustomerBean.java public class CustomerBean implements Serializable{ private static final long serialVersionUID = 1L; String id; String firstName; String surname; String address; String phoneNumber; }
The relationship between the two types or Maps follows:
Application.java public class Application { static public void main(String [] args) throws Exception { ObjectGrid og = ObjectGridManagerFactory.getObjectGridManager().createObjectGrid(); og.defineMap("Order"); og.defineMap("Customer"); // Define the schema 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.addQueryRelationship(new QueryRelationship( OrderBean.class.getName(), CustomerBean.class.getName(), "customerId", null)); og.setQueryConfig(queryCfg); Session s = og.getSession(); ObjectMap orderMap = s.getMap("Order"); ObjectMap custMap = s.getMap("Customer"); s.begin(); CustomerBean cust = new CustomerBean(); cust.address = "Main Street"; cust.firstName = "John"; cust.surname = "Smith"; cust.id = "C001"; cust.phoneNumber = "5555551212"; custMap.insert(cust.id, cust); OrderBean o = new OrderBean(); o.customerId = cust.id; o.date = new java.util.Date(); o.itemName = "Widget"; o.orderNumber = "1"; o.price = 99.99; o.quantity = 1; orderMap.insert(o.orderNumber, o); s.commit(); s.begin(); ObjectQuery query = s.createObjectQuery( "SELECT c FROM Order o JOIN o.customerId as c WHERE o.itemName='Widget'"); Iterator result = query.getResultIterator(); cust = (CustomerBean) result.next(); System.out.println("Found order for customer: " + cust.firstName + " " + cust.surname); s.commit(); } }
The equivalent XML in the ObjectGrid deployment descriptor follows:
<?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"/> <querySchema> <mapSchemas> <mapSchema mapName="Order" valueClass="com.mycompany.OrderBean" primaryKeyField="orderNumber" accessType="FIELD"/> <mapSchema mapName="Customer" valueClass="com.mycompany.CustomerBean" primaryKeyField="id" accessType="FIELD"/> </mapSchemas> <relationships> <relationship source="com.mycompany.OrderBean" target="com.mycompany.CustomerBean" relationField="customerId"/> </relationships> </querySchema> </objectGrid> </objectGrids> </objectGridConfig>