Каков правильный подход к использованию GWT с постоянными объектами? - PullRequest
4 голосов
/ 04 апреля 2010

В настоящее время я работаю над простым веб-приложением через движок Google App с использованием GWT. Следует отметить, что это моя первая попытка решения такой задачи.

Я столкнулся со следующей проблемой / дилеммой:

У меня есть простой класс (получатели / установщики и ничего более. Для ясности я буду называть этот класс DataHolder), и я хочу сделать его постоянным. Для этого я использовал JDO, что потребовало от меня добавления некоторых аннотаций и, в частности, добавления поля Key, которое будет использоваться в качестве первичного ключа.

Проблема в том, что использование класса Key требует от меня импорта com.google.appengine.api.datastore.Key, что нормально на стороне сервера, но тогда я не могу использовать DataHolder на стороне клиента, потому что GWT не разрешить это (насколько я знаю).

Итак, я создал родственный класс ClientDataHolder, который почти идентичен, хотя он не имеет всех аннотаций JDO и поля Key.

Теперь это действительно работает, но мне кажется, что я делаю что-то не так. Использование этого подхода потребует поддержки двух отдельных классов для каждой сущности, которую я хочу иметь.

Итак, мой вопрос: есть ли лучший способ сделать это?

Спасибо.

1 Ответ

2 голосов
/ 04 апреля 2010

Вы правы, считая, что сохранение двух версий ваших объектов кажется неправильным - вся идея GWT заключается в том, что вы можете делиться объектами на стороне сервера на стороне клиента, и если вы начнете разводить эти две не в полной мере использовать GWT.

Что касается решения вашей проблемы, я не слышал ничего хорошего, кроме Objectify , альтернативного API в хранилище данных, созданного только для App Engine. Помимо множества преимуществ, он также безопасен для GWT, поэтому вы можете передавать ключи и все между клиентом и сервером. Подробнее здесь .

Однако, если вы хотите использовать JDO / JPA, вы можете просто сохранить свои идентификаторы сущностей в виде строк или длин, например:

@PersistenceCapable(identityType = IdentityType.APPLICATION)  
public class SomeDomainClass implements Serializable {  
  @PrimaryKey  
  @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)  
  @Extension(vendorName = "datanucleus", key = "gae.encoded-pk", value = "true")  
  String id;
}

Подробнее об этом здесь (вот где я бесстыдно украл этот пример кода)

...