2013-08-03 6 views
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.fromAPI, property.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); 
} 

ответ

2

Прочитайте "Дополнительные соображения" раздела Refs этого документа:

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

Refs не держат значение лица; они просто удерживают ключ и позволяют загружать значение непосредственно из сеанса (или хранилище данных, если оно отсутствует в сеансе). Если вы хотите сохранить новую версию адреса, вам нужно сохранить() его явно.

Также: Каскадных save() из Refs не может быть, потому что Refs не содержит объекты сущности! Они просто «указатели».

Смежные вопросы