2

既存のエンティティを更新しようとしましたが、使用Ref.createするとキャッシュされた値が使用されます。クライアント オブジェクトは次のとおりです。

public class RealEstatePropertyAPI {
    private Long id;
    private String name;
    private AddressAPI address;
}

public class AddressAPI {
    private Long id;
    private String street;
    private String city;
    private String state;
    private String zip;
    private String country;
}

サーバー側の対応するオブジェクト:

@Entity
public class RealEstateProperty {
    @Id
    private Long id;
    @Parent
    private Ref<Owner> owner;
    private String name;
    @Load
    private Ref<Address> address;
}

@Entity
public class Address {
    @Id
    private Long id;
    private String street;
    private String city;
    private String state;
    private String zip;
    private String country;
}

クライアント オブジェクトからサーバー オブジェクトに変換するメソッドがあります。

public static RealEstateProperty fromAPI(RealEstatePropertyAPI api,
        Owner owner) {
    RealEstateProperty property = new RealEstateProperty();
    property.setId(api.getId());
    property.setName(api.getName());
    property.setOwner(owner);
    if (api.getAddress() != null) {
        Address address = AddressConverter.fromAPI(api.getAddress());
        String x = address.getStreet();
        property.setAddress(address);
        String y = property.getAddress().getStreet();
        System.out.println(x.equals(y));
    }
    return property;
}

public static Address fromAPI(AddressAPI api) {
    Address address = new Address();
    address.setId(api.getId());
    address.setStreet(api.getStreet());
    address.setCity(api.getCity());
    address.setState(api.getState());
    address.setZip(api.getZip());
    address.setCountry(api.getCountry());
    return address;
}

問題はにありRealEstateProperty.fromAPIproperty.setAddress(address);新しいAddressものを設定することになっていますが、そうではありません。x.equals(y)false を返すのはなぜですか?

メソッド:

public void setAddress(Address value) {
    this.address = Ref.create(value);
}

エンティティの更新に関する関連する質問。RealEstateProperty次の呼び出しはとその子の両方を更新しますAddressか?

public void update(RealEstateProperty property) {
    ofy().save().entity(property);
}
4

1 に答える 1

3

このドキュメントの参照セクションの「追加の考慮事項」を読んでください。

https://code.google.com/p/objectify-appengine/wiki/Entities

参照はエンティティ値を保持しません。それらは単にキーを保持し、値をセッション (またはセッションにない場合はデータストア) から直接ロードできるようにします。アドレスの新しいバージョンを保持したい場合は、それを明示的に save() する必要があります。

また: Ref はエンティティ オブジェクトを保持しないため、Ref のカスケード save() はあり得ません! それらは単なる「ポインター」です。

于 2013-08-04T16:34:02.177 に答える