0

所有された1対多の関係を作成するとき、Javaで、低レベルのDatastoreAPIとDataNucleusJDOを使用することで結果のレコードに違いがあることに気づきました。これが意図的なものなのか、それとも修正する方法なのかわからない。

例えば、

次のリンクに従業員の住所が複数ある場合:

https://developers.google.com/appengine/docs/java/datastore/entities#Ancestor_Paths

次のように低レベルのデータストアAPIを使用すると、従業員レコードには住所列(つまりプロパティ)が表示されません。

Entity employee = new Entity("Employee");
datastore.put(employee);

Entity address_home = new Entity("Address", employee.getKey());
datastore.put(address_home);

Entity address_mailing = new Entity("Address", employee.getKey());
datastore.put(address_mailing);

JDOを使用すると、従業員レコードに住所列(つまりプロパティ)が表示されます。

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

    @Persistent(mappedBy = "employee")
    private List<Address> addresses;

    List<Address> getAddresses() {
        return addresses;
    }
    void setAddresses(List<Address> addresses) {
        this.addresses = addresses;
    }

    // ...
}

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

    @Persistent
    private Employee employee;

    @Persistent
    private String Street;

    ...
 }

余分なプロパティは無害です。しかし、なぜこれがJDOに必要なのですか?

開発サーバー上のDataNucleusv2でGAE/J1.7.2を使用しています。

4

1 に答える 1

1

GAE JDOプラグインの最新のストレージバージョンは、すべてのリレーションをプロパティとしてオブジェクトに格納するため、Employeeクラスには格納するアドレスのプロパティがあります。これは、GAE JDOが物を保存するために使用した方法よりもはるかに論理的な方法です(元々、反対側の所有権を使用して外部キーをシミュレートしようとしました)。所有者にリストを保存すると、要素をコレクションにロードできるだけでなく、要素をリストに複数回表示できるという利点があります(古いストレージバージョンでは不可能です)。

2.1.1までのGAEJDOのすべてのバージョンは、リスト内の各アドレスにインデックス位置を格納しますが、Employeeの「addresses」プロパティが提供するため、実際には今すぐ格納する必要はありません。これは初期から残っています。それを必要としたバージョンはそのように保存されました。バージョン2.1.2以降では、そのリストインデックスプロパティを要素に追加しません。

于 2012-09-30T06:21:00.640 に答える