Выдает Nullpointerexception при вставке объекта с использованием автоматически сгенерированного метода вставки Classendpoint
Я запутался в использовании автоматически сгенерированного класса конечной точки. Я хочу использовать сгенерированную конечную точку для вставки нового объекта в хранилище данных. Но, исключение бросает.
fooEndpoint.insertFoo(foo); // throws null pointer exception
Мой класс сущности похож на данный пример в этом источнике:https://developers.google.com/appengine/docs/java/datastore/jpa/overview.
Вот моя сущность:
@Entity
public class Foo {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Key ID;
Вот трассировка стека:
java.lang.NullPointerException
at org.datanucleus.api.jpa.JPAEntityManager.find(JPAEntityManager.java:318)
at org.datanucleus.api.jpa.JPAEntityManager.find(JPAEntityManager.java:256)
at com.FooEndpoint.containsFoo(FooEndpoint.java:150)
at com.FooEndpoint.insertFoo(FooEndpoint.java:96)
С другой стороны, я могу вставить новый объект, когда использую метод EntityManager persist. Потому что это не проверяет, существует или нет в хранилище данных.
Я ожидаю, что метод вставки classEndpoint должен сохранить объект и дать автоматический ключ в поле идентификатора.
Или мне нужно инициализировать поле идентификатора.
Вот автоматически сгенерированный метод класса конечной точки insertFoo.
/**
* This inserts a new entity into App Engine datastore. If the entity already
* exists in the datastore, an exception is thrown.
* It uses HTTP POST method.
*
* @param foo the entity to be inserted.
* @return The inserted entity.
*/
public Foo insertFoo(Foo foo) {
EntityManager mgr = getEntityManager();
try {
if (containsFoo(foo)) {
throw new EntityExistsException("Object already exists");
}
mgr.persist(foo);
} finally {
mgr.close();
}
return foo;
}
Вот метод содержит
private boolean containsFoo(Foo foo) {
EntityManager mgr = getEntityManager();
boolean contains = true;
try {
Foo item = mgr.find(Foo.class, foo.getID()); // exception occurs here
if (item == null) {
contains = false;
}
} finally {
mgr.close();
}
return contains;
}
foo.getID () является нулем. Потому что это новый объект. Я ожидаю, что механизм приложений создает ключ для этого. Или мне нужно явно создать ключ для него?
Другие поля в классе Foo являются простыми типами, такими как String и booleans.
Спасибо за ваше время.