Каков правильный подход к использованию GWT с постоянными объектами?


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

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

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

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

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

Спасибо.

1 4

1 ответ:

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

Что касается решения вашей проблемы, я слышал только хорошие вещи о Objectify, альтернативном API в хранилище данных, которое строится только для движка приложений. Среди его многочисленных преимуществ, это также 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;
}

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