GAE JPA 2.0 Txn быстрый откат

1

Еще раз я схожу с ума над тем, чего раньше никогда не было. Я изменил несколько файлов в своем проекте (на уровне презентации и сущности, которые не имеют никакого отношения к уровню обработки данных). Может кто-нибудь, пожалуйста, скажите мне, почему следующий код приведет к этому журналу ошибок? Я имею в виду, почему он не видит, что я совершил Txn и закрыл EntityManager. Я сделал предупреждение полужирным, потому что это проблема, а не исключение NullPointerException. Исключение NullPointerException является результатом того, что запрос ничего не возвращал, и учитель оставался нулевым, потому что транзакция откатилась, и я не знаю, почему.

String Email = "[email protected]";
EntityManager em = EMF.get().createEntityManager();
em.getTransaction().begin();
TypedQuery<Teacher> query = em.createQuery("SELECT s FROM Teacher s WHERE s.Email = ?1", Teacher.class);
query.setParameter(1, Email);
Teacher teacher = (Teacher)query.getSingleResult();
teacher.getTeacherInf(); // Lazy Parameter
em.getTransaction().commit();
em.close();
//Lazy Parameter must be fetched before closing. Tried without fetching, same result

Вот учитель. Класс

@Entity
public class Teacher implements Serializable
{
private static final long serialVersionUID = 5426530769458891752L;
@Id
private long ID;
private String FName;
private String LName;
private String Email;
@OneToOne(cascade = CascadeType.ALL,fetch=FetchType.LAZY)
private TeacherInfo teacherInf;
// Constructor & getters & setters ...}

и, наконец, это Ошибка и Предупреждение

Sep 01, 2014 5:01:28 AM com.google.apphosting.utils.servlet.TransactionCleanupFilter handleAbandonedTxns ПРЕДУПРЕЖДЕНИЕ: Запрос завершен без совершения транзакции с транзакцией или откат транзакции с идентификатором 1. Транзакция будет отменена. Sep 01, 2014 5:01:28 AM com.google.apphosting.utils.jetty.JettyLogger warn

ПРЕДУПРЕЖДЕНИЕ:/Войти

java.lang.NullPointerException в com.google.appengine.datanucleus.query.QueryEntityPKFetchFieldManager.fetchLongField(QueryEntityPKFetchFieldManager.java:74) в org.datanucleus.identity.IdentityUtils.getApplicationIdentityForResultSetRow(IdentityUtils.java:101) в com.google.appengine. datanucleus.EntityUtils.entityToPojo(EntityUtils.java:1011) в com.google.appengine.datanucleus.query.DatastoreQuery $ 2.apply(DatastoreQuery.java:229) в com.google.appengine.datanucleus.query.DatastoreQuery $ 2.apply( DatastoreQuery.java:226) в com.google.appengine.datanucleus.query.LazyResult.resolveNext(LazyResult.java:96) в com.google.appengine.datanucleus.query.LazyResult.resolveAll(LazyResult.java:121) at com.google.appengine.datanucleus.query.LazyResult.size(LazyResult.java:115) в com.google.appengine.datanucleus.query.StreamingQueryResult.size(StreamingQueryResult.java:151) на org.datanucleus.store.query.AbstractQueryResult.toArray(AbstractQueryResult.java:400) в java.util.ArrayList.addAll(ArrayL ist.java:559) на org.datanucleus.query.evaluator.JavaQueryEvaluator.execute(JavaQueryEvaluator.java:160) на org.datanucleus.query.evaluator.JPQLEvaluator.execute(JPQLEvaluator.java:112) на com.google.appengine.datanucleus.query.JPQLQuery.performExecute(JPQLQuery.java:200) в org.datanucleus.store.query.Query.executeQuery(Query.java:1789) на org.datanucleus.store.query.Query.executeWithMap(Query.java: 1693) в org.datanucleus.api.jpa.JPAQuery.getSingleResult(JPAQuery.java:232) в servelet.User.Login.UserAuthentication.doPost(UserAuthentication.java:48) в javax.servlet.http.HttpServlet.service( HttpServlet.java:637) в javax.servlet.http.HttpServlet.service(HttpServlet.java:717) в org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511) в org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1166) в servelet.Filters.GlobalFilter.doFilter(GlobalFilter.java:27) в org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1 157) в com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74) в org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157) в com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:127) в org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157) в com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34) в org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157) в com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java: 63) в org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157) в com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43) в org.mortbay. jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157) в com.google.appengine.tools.devel opment.StaticFileFilter.doFilter(StaticFileFilter.java:125) в org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157) в com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectRequest(DevAppServerModulesFilter. java: 366) в com.google.appengine.tools.development.DevAppServerModulesFilter.doDirectModuleRequest(DevAppServerModulesFilter.java:349) в com.google.appengine.tools.development.DevAppServerModulesFilter.doFilter(DevAppServerModulesFilter.java:116) в org.mortbay.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1157) в org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388) в org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java: 216) at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182) в org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765) в org.mortbay.jetty. webapp.WebAppContext.handle(WebAppContext.java:418) в com.google.appen gine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:98) в org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) в com.google.appengine.tools.development.JettyContainerService $ ApiProxyHandler. handle (JettyContainerService.java:491) в org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) в org.mortbay.jetty.Server.handle(Server.java:326) на org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542) в org.mortbay.jetty.HttpConnection $ RequestHandler.content(HttpConnection.java:938) в org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:755) в org. mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218) в org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404) в org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409) at org.mortbay.thread.QueuedThreadPool $ PoolThread.run(QueuedThreadPool.java:582)

Обновления:

Я сделал несколько тестов, и вот результаты: 1) Первичный ключ ищет... не проблема, работает как шарм даже через уровень обработки данных. 2) TypedQueries дает 2 вида ошибок: A) если сущность существует, я получаю NullPointerException (предупреждение и ошибка, размещенные выше) B), если сущность не существует, я получаю ResultNotFoundException (ну, что довольно нормально)

но здесь дело в том, что Query находит Entity и только делает это, если он существует, и если результата нет, он дает ResultNotFoundException.

Пожалуйста, в этот момент я готов в значительной степени попробовать все и все, чтобы заставить это работать.

Теги:
jpa
google-app-engine
transactions

2 ответа

0
Лучший ответ

Когда я использовал long (примитивное) как мое поле Id, у меня была точно такая же трассировка стека, о которой вы сообщали. Все, что мне нужно было сделать, это изменить тип на Long (класс).

0

Ну, я до сих пор не знаю, что происходит, и будет признателен за добавленную обратную связь, но кажется, что, как только я удалил длинный идентификатор и преобразовал его в ключ (хотя другой объект, тот же проект имеет длинные первичные ключи и все работает просто отлично), запросы начали проникать как шарм... Во всяком случае, я надеюсь, что кто-то, у кого больше опыта, может объяснить это поведение, потому что это действительно меня достало

Ещё вопросы

Сообщество Overcoder
Наверх
Меню