オブジェクトのリレーション

永続オブジェクトの関係

データストアに保存されるオブジェクトは、永続オブジェクト (persistent object) といいます。 Google App Engine のデータストアでは、永続オブジェクトでできることできないことがあります。

特にここでは永続オブジェクトにおける、オブジェクト間の関係について簡単に説明します。

基本となる考え方は、所有関係方向です。

「所有関係」とは?

はじめに、永続オブジェクトの関係で非常に大切な考え方である、「所有関係」について説明します。

オブジェクト B がオブジェクト A なしに存在できない場合、オブジェクト A はオブジェクト B を所有している (Owned) といいます。

例えば車を表す Car クラスがあり、それがドアを表す Door クラスを含んでいたとします。この場合、Car を削除すると Door も削除されてしまうとします。 このような場合、車 (Car) はドア (Door) を所有している (Owned) といいます。

コードで示すと次のようになります。まず子オブジェクトとなる Door クラスは次のようになります。

@PersistenceCapable
public class Door {
  @PrimaryKey
  @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
  private Key key;

  ...
  public String getColor(){
    return color;
  }
}

親オブジェクトとなる Car クラスでは次のように、Door を保持するフィールドを持っています。

@PersistenceCapable
public class Car {
    @PrimaryKey
    @Persistent(valueStrategy=IdGeneratorStrategy.IDENTITY)
    private Key key;
    
    @Persistent
    private Door door;
    
  ...
}

上記の場合は Car クラスがひとつの Door を所有しています。この状況は一対一の所有関係 (Owned One-to-One Relationship) といいます。

通常、所有している側を親オブジェクト、所有されている側を子オブジェクトといいます。上の例では、 車が親オブジェクトで、ドアが子オブジェクトです。

またもし、車 (Car オブジェクト) が複数のドアオブジェクト・コレクション (Door オブジェクト) を所有している場合は、一対多の所有関係 (Owned One-to-Many Relationship) といいますが、 とりあえず、それはまた後で説明することとします。この資料ではもうすこし一対一の所有関係について掘り下げましょう。

ちなみに、オブジェクト A とオブジェクト B がそれぞれ独立して存在できる場合は、所有関係はありません。これを非所有 (Unowned) といいます。

現在の Google App Engine の JDO の実装では一対一の所有関係、一対多の所有関係をサポートしています

「オブジェクトの方向」とは?

親オブジェクトが子オブジェクトを所有しており、子オブジェクトが親オブジェクトへの参照を保持していない場合、 単一方向関連 (Unidirectional relationship) といいます。

単一方向関連

子オブジェクトが親オブジェクトへの参照を保持している場合は、 双方向関連 (Bidirectional relationship) です。

双方向関連

Google App Engine の JDO の実装では、単一方向および双方向両方の関係をサポートしています。

では具体的にどのように実装したらよいかみてみましょう。