2015-12-09 2 views
0

Дизайн:Как обновить объект Ref'ed?

  • Entity A, B и C
  • С Ref'd в Б, В и А Ref'd
  • Все три созданы индивидуально
  • При извлечения A, B и C также получены

Проблема: При попытке сохранить обновленный A, я получаю ... эта ошибка:

IOException получил при обновлении липкие: 400 Bad Request { "кода": 400, "ошибки": [{ "домен": "глобальное", "сообщение": «com.google.appengine. repackaged.org.codehaus.jackson.map.JsonMappingException: вы не можете создать Ключ для объекта с нулевым значением @Id. Объект был [email protected]d5 (через цепочку ссылок: com.example.entity_A [\ "owner \"] -> com.example.entity_B [\ "myC \"]) ", " reason ":" badRequest " } ], " message ":" com.google.appengine.repackaged.org.codehaus.jackson.map.JsonMappingException: вы не можете создать Ключ для объекта с нулевым значением @Id. Объект был [email protected] (через эталонной цепи: com.example.entity_A [\ "владелец \"] -> com.example.entity_B [\ "Мус \"])» }

+0

Не можете ли вы объявить объект B «окончательным» и пройти во время строительства А? –

+0

Если вы должны были установить ссылку на объект B на null перед сохранением объекта A, он не будет обновлять объект B. Вы могли бы автоматизировать это в методе '@ BeforeSave' в сущности (это не отличная идея, но она должна работать). Если вы хотите сохранить ссылку, вы можете заменить существующую/старую ссылку на новую с помощью 'Ref.create (Key.create (EntityB, id))', где вы могли бы взять идентификатор из старой ссылки. – konqi

+1

Этот вопрос запутан. В заголовке вы спрашиваете о _embedded_ объектах, но в теле вы говорите, что это 'Ref', который не встроен. Refs - это просто ключи с методами get() - нет каскадного сохранения или обновления. Вы можете уточнить вопрос? – stickfigure

ответ

0

я, наконец, решить эту проблему ... видимо, я не имел метод набора для моего @Id поля, поэтому клиентская библиотека, автоматически созданная, не знала, как установить значение на стороне клиентской библиотеки.

0

, к сожалению, Java всегда передается по ссылке, означает, что любой объект A = B, который вы пытаетесь изменить B, A тоже изменится, единственный способ сделать это - создать новый Object A = new Object(), а затем скопировать содержимое Объект B в объект А, будет что-то вроде этого

int someInt = 5; 
Object B = new Object(someInt); 

где конструктор класса Object с "someInt" параметр.

class Object { 
int j; 
Object(Int i) 
{ 
this.j=i; 
} 
int getInt() 
{ 
    return j; 
} 

тогда вы создаете и уравнять содержание А СОДЕРЖАНИЯ В

Object A = new Object(B.getInt());