Google App Engine, JDO и equals/Хэш-код
-
10-07-2019 - |
Вопрос
У меня есть приложение в Google App Engine, которое работало нормально.Я понял, что в одном из моих объектов с улучшенным JDO я забыл реализовать equals и hashCode (мне нужно использовать объект в наборе).Так я и сделал.На самом деле я не делал ничего особенного в этих реализациях, на самом деле я просто использовал Eclipse для их генерации.Вот так:
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;
@Persistent
private String appleId;
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((appleId == null) ? 0 : appleId.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (appleId == null) {
if (other.appleId != null)
return false;
} else if (!appleId.equals(other.appleId))
return false;
return true;
}
Итак, теперь, когда я пытаюсь перейти по любым URL-адресам в приложении, генерируется это исключение:
/addUser исключение javax.jdo.JDOUserException:Постоянный класс "Класс com.bpapa.myapp.domain.Пользователь, похоже, не был улучшен.Возможно, вы захотите повторно запустить усилитель и проверить, нет ли ошибок в выходных данных." не имеет таблицы в базе данных, но операция требует этого.Пожалуйста, проверьте спецификацию метаданных для этого класса.в org.datanucleus.jdo.NucleusJDOHelper.getJDOExceptionForNucleusException(NucleusJDOHelper.java:427) в org.datanucleus.jdo.JDOQuery.execute(JDOQuery.java:249) в com.bpapa.myapp.servlet.AddUserServlet.Опубликовать(AddUserServlet.java:34)
Есть идеи о том, что я сделал не так?
Решение
Настроен ли у вас eclipse на автоматический запуск datanucleus enhancer?Что, если вы попробуете очистить проект с помощью project-> clean, а затем создадите проект с нуля?
Другие советы
Конфигурация в eclipse (проблема, связанная с "запуском datanucleus enhancer", как обсуждалось выше)
Настройки проекта -> Google -> App Engine -> ORM
Измените путь src parh "src/" на точный путь "src //" ваших классов JDO
Я столкнулся с той же проблемой, и когда я выполнил Проект -> Очистить, я увидел следующее исключение в журнале:
{Caused by: org.datanucleus.exceptions.NucleusException: Plugin (Bundle) "org.datanucleus.store.appengine" is already registered. Ensure you dont have multiple JAR versions of the same plugin in the classpath. The URL "file:/C:/Documents%20and%20Settings/Administrator/workspace/Guestbook/war/WEB-INF/lib/datanucleus-appengine-1.0.8.final.jar" is already registered, and you are trying to register an identical plugin located at URL "file:/C:/eclipse/plugins/com.google.appengine.eclipse.sdkbundle.1.4.2_1.4.2.v201102111811/appengine-java-sdk-1.4.2/lib/user/orm/datanucleus-appengine-1.0.8.final.jar."}
Итак, я удалил:
C:/Documents and Settings/Administrator/workspace/Guestbook/war/WEB-INF/lib/datanucleus-appengine-1.0.8.final.jar
из проекта eclipse, очищенного и переделанного заново, все начало работать так, как ожидалось.
Я решил эту проблему, обновив appengine java sdk до последней версии.