2011-02-25 59 views
0

我正在尝试创建一个新对象Session并将其保存到数据库中。它有一个对象User的持久变量。我查询了要添加到会话中的用户的数据库。如果用户的密码不匹配“hello”(现在很明显),请停止。如果有,创建一个新会话,设置常规变量并添加sOwner(只需设置Session的用户变量)。与此类似,代码工作,但不检查密码...读取持久对象的变量可防止将其添加到对象中

try { 
    Query u = pm.newQuery(User.class); //Query for user 
    u.setFilter("email == eaddr"); 
    u.declareImports("import java.lang.String"); 
    u.declareParameters("String eaddr"); 
    @SuppressWarnings("unchecked") 
    List<User> res = (List<User>)u.execute(email); 
    sOwner = res.get(0); 
    //if (!sOwner.getPassword().equals("hello")) { // comment out 
    //throw new Exception("password not correct"); // these three lines 
    //}         // and it works 
    sNew = new Session(); 
    sNew.setUser(sOwner); 
    sNew.setIpAddr(ipAddr); 
    sNew.setStartedOn(new Date()); 
    sNew.setToken(token); 
    pm.makePersistent(sNew); 
} catch (Exception e) { 
} 

,但没有if语句注释掉,最终的变化犯有这样的错误:

2385571 [btpool0-0] DEBUG DataNucleus.Persistence - Object "[email protected]" (id="com.yachtcloser.server.om.Session:381") is having the value in field "startedOn" replaced by a SCO wrapper 
2385571 [btpool0-0] DEBUG DataNucleus.Datastore.Native - INSERT INTO `SESSION` (`TOKEN`,`STARTEDON`,`USERAGENT`,`IPADDR`,`USER_ID_OID`,`ID`) VALUES (<'90a9d90f325c3b'>,<2011-02-24 19:12:15.595>,<null>,<'127.0.0.5'>,<21>,<381>) 
2385572 [btpool0-0] DEBUG DataNucleus.Datastore.Persist - Execution Time = 1 ms (number of rows = 1) 
2385572 [btpool0-0] DEBUG DataNucleus.Persistence - Insert of object "[email protected]" is calling insertPostProcessing for field "com.yachtcloser.server.om.Session.user" 
2385572 [btpool0-0] DEBUG DataNucleus.Persistence - Insert of object "[email protected]" is calling insertPostProcessing for field "com.yachtcloser.server.om.Session.transaction" 
2385572 [btpool0-0] DEBUG DataNucleus.Datastore.Retrieve - Closing PreparedStatement [email protected]18 
2385572 [btpool0-0] DEBUG DataNucleus.Persistence - Insert of object "[email protected]" is calling postInsert for field "com.yachtcloser.server.om.Session.user" 
2385572 [btpool0-0] DEBUG DataNucleus.Persistence - Insert of object "[email protected]" is calling postInsert for field "com.yachtcloser.server.om.Session.transaction" 
2385584 [btpool0-0] DEBUG DataNucleus.Persistence - Object "[email protected]" field "transaction" is replaced by a SCO wrapper of type "org.datanucleus.store.types.sco.backed.List" [cache-values=true, lazy-loading=true, queued-operations=false, allow-nulls=true] 
2385585 [btpool0-0] DEBUG com.yachtcloser.server.DispatchServlet - Response Sent:{"cmds":[{"response":"Session 381 created by user 0"}]} 
2385585 [btpool0-0] DEBUG DataNucleus.Persistence - ObjectManager internalFlush() process started - 1 dirty objects 
2385585 [btpool0-0] DEBUG DataNucleus.Persistence - ObjectManager internalFlush() process finished 
2385589 [btpool0-0] ERROR DataNucleus.Persistence - java.lang.NullPointerException 
2385590 [btpool0-0] DEBUG DataNucleus.Persistence - Disconnecting [email protected] from StateManager[[email protected], lifecycle=P_NEW] 

这里的在NPE的堆栈跟踪我想:

NestedThrowablesStackTrace: 
java.lang.NullPointerException 
    at org.datanucleus.store.rdbms.sql.SQLStatementHelper.selectMemberOfSourceInStatement(SQLStatementHelper.java:723) 
    at org.datanucleus.store.rdbms.request.FetchRequest.processMembersOfClass(FetchRequest.java:478) 
    at org.datanucleus.store.rdbms.request.FetchRequest.<init>(FetchRequest.java:166) 
    at org.datanucleus.store.rdbms.RDBMSPersistenceHandler.getFetchRequest(RDBMSPersistenceHandler.java:329) 
    at org.datanucleus.store.rdbms.RDBMSPersistenceHandler.fetchObject(RDBMSPersistenceHandler.java:306) 
    at org.datanucleus.jdo.state.JDOStateManagerImpl.loadFieldsFromDatastore(JDOStateManagerImpl.java:2028) 
    at org.datanucleus.jdo.state.JDOStateManagerImpl.loadUnloadedFields(JDOStateManagerImpl.java:1685) 
    at org.datanucleus.jdo.state.JDOStateManagerImpl.runReachability(JDOStateManagerImpl.java:3295) 
    at org.datanucleus.ObjectManagerImpl.performReachabilityAtCommit(ObjectManagerImpl.java:3415) 
    at org.datanucleus.ObjectManagerImpl.preCommit(ObjectManagerImpl.java:3268) 
    at org.datanucleus.ObjectManagerImpl$2.transactionPreCommit(ObjectManagerImpl.java:324) 
    at org.datanucleus.TransactionImpl.internalPreCommit(TransactionImpl.java:394) 
    at org.datanucleus.TransactionImpl.commit(TransactionImpl.java:279) 
    at org.datanucleus.jdo.JDOTransaction.commit(JDOTransaction.java:90) 
    at com.yachtcloser.server.UserContext.finishRequest(UserContext.java:181) 
    at com.yachtcloser.server.DispatchServlet.doPost(DispatchServlet.java:185) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    at com.yachtcloser.server.DispatchServlet.service(DispatchServlet.java:55) 
    at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) 
    at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362) 
    at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) 
    at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) 
    at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729) 
    at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49) 
    at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) 
    at org.mortbay.jetty.Server.handle(Server.java:324) 
    at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505) 
    at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843) 
    at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647) 
    at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) 
    at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380) 
     at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) 
    at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488) 

我试着拆卸副本,比较该密码,然后将原来的查询结果 到会话,这没”不管工作。下面是我不能的方式编辑会话的重要组成部分:

@PersistenceCapable(identityType=IdentityType.APPLICATION) 
public class Session implements Comparable<Session> { 

    @PrimaryKey 
    @Persistent(valueStrategy=IdGeneratorStrategy.INCREMENT) 
    private long id; 

    @Persistent 
    private User user; 

DataNucleus将核-2.2.2.jar,DataNucleus将-连接池-2.0.3.jar,DataNucleus将-googlecollections-2.2.0 -release.jar,datanucleus-jdo-query-2.2.1.jar,datanucleus-rdbms-2.2.2.jar,jdo2-api-2.3-ec.jar,datanucleus-enhancer-2.1.3.jar,asm-3.3 .jar这些是我看到的jar文件

+0

你得到一个NPE,但不引用堆栈跟踪,所以我们不能看到它来自哪里 - 这将是从头开始。同时声明正在使用的软件的版本以及正在使用的数据存储 – DataNucleus 2011-02-26 15:21:50

+0

MySql 5.1和10.10 Ubuntu,在Eclipse中开发。我添加了我所认为的你正在谈论的堆栈跟踪。 – eric 2011-02-28 21:22:45

回答

0

查询生成SQL。这是打印在DataNucleus日志中。因此你应该检查为你的查询生成的SQL。堆栈跟踪是从tx.commit()创建的,但您没有提到这样的调用。

你不会说每个插件jar的DataNucleus的使用版本。

+0

我添加了jar文件名;我包含的堆栈跟踪与我堆栈跟踪 .currentTransaction.commit()时相同。提交在第14行被引用关于我相信“在org.datanucleus.TransactionImpl.commit(TransactionImpl.java:279)”我所知道的是,它是在首先发布的try/catch完成以及它返回的函数完成后提交的。 – eric 2011-03-01 21:30:44

+0

和SQL?展示一些东西的唯一方法就是在简单的测试用例中展示它。 – DataNucleus 2011-03-02 05:11:51

+0

我的老板发现了这个问题,严格持久性检查或预提的datanucleus选项,现在它工作正常。感谢您的努力和抱歉,我无法提供您需要的信息,我是新手:/ – eric 2011-03-02 17:15:34

相关问题