Выдает 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.

Спасибо за ваше время.

Ответы на вопрос(2)

Ваш ответ на вопрос