エンティティー・マネージャーのチュートリアル: エンティティー・リレーションシップの形成

リレーションシップを持つ 2 つのエンティティー・クラスを作成し、それらのエンティティーを ObjectGrid に登録し、エンティティー・インスタンスをキャッシュに格納することで、エンティティー間の簡単なリレーションシップを作成します。

手順

  1. Customer エンティティーを作成します。このエンティティーは、カスタマーの情報を Order オブジェクトとは別に格納するために使用されます。 Customer エンティティーの例を次に示します。
    Customer.java
    @Entity
    public class Customer
    {
        @Id String id;
        String firstName;
        String surname;
        String address;
        String phoneNumber;
    }
    このクラスには、名前、住所、電話番号といった、カスタマーに関する情報が含まれます。
  2. Order オブジェクトを作成します。このオブジェクトは エンティティー・マネージャーのチュートリアル: エンティティー・クラスの作成トピックの Order オブジェクトと類似しています。 Order オブジェクトの例を次に示します。
    Order.java
    
    @Entity
    public class Order
    {
        @Id String orderNumber;
        Date date;
        @ManyToOne(cascade=CascadeType.PERSIST) Customer customer;
        String itemName;
        int quantity;
        double price;
    }
    この例では、Customer オブジェクトへの参照が customerName 属性に取って代わります。 この参照には多対 1 リレーションシップを示すアノテーションが付いています。 多対 1 リレーションシップは各オーダーに 1 人のカスタマーがあることを示しますが、複数のオーダーが同じカスタマーを参照することもあります。 カスケード・アノテーション修飾子は、エンティティー・マネージャーで Order オブジェクトを永続化させる場合に、Customer オブジェクトも永続化させる必要があることを示しています。カスケード永続化オプション (デフォルトのオプション) を設定しない場合は、Order オブジェクトとともに Customer オブジェクトを手動で永続化する必要があります。
  3. エンティティーを使用して、ObjectGrid インスタンスのマップを定義します。 各マップは特定のエンティティーに対して定義されています。1 つのエンティティーの名前は Order で、もう 1 つのエンティティーの名前は Customer です。 次のアプリケーション例は、カスタマー・オーダーの格納および取得方法を示しています。
    Application.java
    
    public class Application
    {
        static public void main(String [] args)
            throws Exception
        {
            ObjectGrid og = 
    					ObjectGridManagerFactory.getObjectGridManager().createObjectGrid();
            og.registerEntities(new Class[] {Order.class});
    
            Session s = og.getSession();
            EntityManager em = s.getEntityManager();
    
            em.getTransaction().begin();
    
            Customer cust = new Customer();
            cust.address = "Main Street";
            cust.firstName = "John";
            cust.surname = "Smith";
            cust.id = "C001";
            cust.phoneNumber = "5555551212";
    
            Order o = new Order();
            o.customer = cust;
            o.date = new java.util.Date();
            o.itemName = "Widget";
            o.orderNumber = "1";
            o.price = 99.99;
            o.quantity = 1;
    
            em.persist(o);
            em.getTransaction().commit();
    
            em.getTransaction().begin();
            o = (Order)em.find(Order.class, "1");
            System.out.println("Found order for customer: " 
    					+ o.customer.firstName + " " + o.customer.surname);
            em.getTransaction().commit();
    	// Close the session (optional in Version 7.1.1 and later) for improved performance
    	s.close();
        }
    }
    このアプリケーションは、直前のステップにあるアプリケーション例と類似しています。 前の例では、単一のクラス Order のみが登録されました。 WebSphere® eXtreme Scale では、Customer エンティティーへの参照を 検出して自動的に組み込むため、John Smith の Customer インスタンスが作成されると、 新しい Order オブジェクトから参照されます。この結果として、 新しいカスタマーは自動的に永続化されます。これは、2 つのオーダーの関係には、 各オブジェクトの永続化を必要とするカスケード修飾子が組み込まれているためです。Order オブジェクトが見つかると、エンティティー・マネージャーでは、関連の Customer オブジェクトを自動的に検出し、このオブジェクトへの参照を挿入します。