【问题标题】:Updating an existing entity with objectify使用 objectify 更新现有实体
【发布时间】:2013-08-03 16:28:11
【问题描述】:

我尝试更新现有实体,但在使用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);
}

【问题讨论】:

    标签: google-app-engine objectify


    【解决方案1】:

    阅读本文档参考部分的“其他注意事项”:

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

    Refs 不保存实体值;他们只需持有密钥,让您直接从会话中加载值(或数据存储,如果它不在会话中)。如果你想持久化一个新版本的地址,你需要明确地 save() 它。

    另外:Refs 不能级联 save(),因为 Refs 不包含实体对象!它们只是“指针”。

    【讨论】:

      猜你喜欢
      • 2012-06-12
      • 1970-01-01
      • 1970-01-01
      • 2011-12-19
      • 1970-01-01
      • 2011-01-21
      • 1970-01-01
      • 1970-01-01
      • 2012-07-15
      相关资源
      最近更新 更多