Каков правильный подход к использованию GWT с постоянными объектами?
В настоящее время я работаю над простым веб-приложением через Google App engine с использованием GWT. Следует отметить, что это моя первая попытка выполнить такую задачу.
Я столкнулся со следующей проблемой / дилемой:
У меня есть простой класс (геттеры / сеттеры и ничего больше. Для ясности я буду называть этот класс DataHolder
) и хочу сделать его постоянным. Для этого я использовал JDO
, что потребовало от меня добавить некоторые аннотации и, более конкретно, добавить поле Key
в может использоваться в качестве первичного ключа.
Проблема в том, что использование класса Key
требует от меня импорта com.google.appengine.api.datastore.Key
, что нормально на стороне сервера, но тогда я не могу использовать DataHolder
на стороне клиента, потому что GWT
не позволяет этого (насколько я знаю).
ClientDataHolder
, который почти идентичен, хотя у него нет всех аннотаций JDO
и поля Key
.
Теперь это действительно работает, но мне кажется, что я делаю что-то не так. Использование такого подхода позволило бы требуется поддерживать два отдельных класса для каждой сущности, которую я хочу иметь.
Итак, мой вопрос: есть ли лучший способ сделать это?
Спасибо.
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; }
Подробнее об этом Здесь (именно там я бессовестно украл этот пример кода)