Как избавиться от «Сохраняемого объекта с идентификатором XXX имеет нулевую версию» в GWT?

#exception #gwt #version #requestfactory

#исключение #gwt #версия #requestfactory

Вопрос:

В настоящее время я разрабатываю приложение с использованием GWT / RequestFactory и Hibernate / JPA в качестве поставщика ресурсов для сохранения.

Итак, я начал изменять свои классы сущностей, создал EntityProxies, поместил столбец версии с соответствующим отображением в orm.xml (извините за поклонников аннотаций, я все еще делаю это по-старому), получил hibernate правильно генерирует схему базы данных, но когда я пытаюсь что-то сделать в нем, у меня возникает исключение :

 @ProxyFor(XXXXX)
public interface UserProxy extends EntityProxy {
    public Long getId();
    public void setId(Long id);
    public Integer getVersion();
    public void setVersion(Integer version);

    // removed ...
}
  

"The persisted entity with id XXX has a null version"

Я просматриваю таблицу базы данных, столбец version там есть … со значением

итак, кто-нибудь может сказать мне, что не так? Будем признательны за любую помощь…

большое спасибо,

Ответ №1:

Установите точку останова в, SimpleRequestProcessor.createReturnOperations() где domainVersion != null выполняется проверка. Является ли объект, у которого нет версии, вновь созданным методами сервиса, или это тот, с которым работал клиент? Если он недавно создан, выполняется ли у вас какая-либо автоматическая фиксация в области запроса, где версия будет назначена после завершения запроса? Если это объект, который был изменен клиентом, посмотрите, поможет ли удаление методов setId() и setVersion() . В общем, ваш EntityProxy интерфейс не должен включать методы setId() и setVersion() , поскольку эти свойства должны устанавливаться только вашим механизмом сохранения.

Комментарии:

1. Я установил точку останова и, наконец, обнаружил, что объект, который я ожидал от domainVersion = service.GetVersion(DomainObject);, не был тем, который я получил… У меня есть иерархия наследования с объектами моего домена, поэтому я заставил ее работать. Я также последовал вашему предложению о том, чтобы не раскрывать методы setId () и setVersion () … спасибо за подсказки! вы, кажется, очень хорошо знаете внутренности GWT, как вы обнаружили, что именно в этот момент мне пришлось установить точку останова в SimpleRequestProcessor ? это потрясающе… еще раз большое спасибо…

Ответ №2:

Если вы используете класс Locator, другой причиной может быть метод Locator GetVersion (), возвращающий null вместо, например, возврата версии объекта. Eclipse по умолчанию генерирует возвращаемое значение null.