简体   繁体   English

从JDBC获取自动递增的ID

[英]Getting autoincremented Id from JDBC

Facing some exception without any clue message. 遇到一些异常,没有任何线索消息。

Here is my JDBC 这是我的JDBC

            statement = con
                    .getConnection()
                    .prepareStatement(
                            "insert into  p3triplets set source_material= ? , process= ? ,target_material= ? , user_id = ?",
                            statement.RETURN_GENERATED_KEYS);
            statement.setString(1, pTriplet.getSource_Name());
            statement.setString(2, pTriplet.getProcessName());
            statement.setString(3, pTriplet.getTargetName());
            statement.setLong(4, user.getId());
            int i = statement.executeUpdate();
            generatedKeys=statement.getGeneratedKeys();
            long genId = generatedKeys.getLong(1);  //Exception
            for (p3TripleChild p3childTriple : childsDummyList) {
                if (p3childTriple.getId() == 0) {
                    p3childTriple.setId(genId);
                }
            }

And the exception is 唯一的例外是

java.sql.SQLException
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
    at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:815)
    at com.mysql.jdbc.ResultSetImpl.getLong(ResultSetImpl.java:2835)
    at com.mysql.jdbc.ResultSetImpl.getLong(ResultSetImpl.java:2830)
    at com.mtc.server.TripleServiceImpl.saveTriplet(TripleServiceImpl.java:161)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:569)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
    at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
    at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    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)

What I am missing ? 我想念什么?

Id generated in database, but unable to get it back. 在数据库中生成的ID,但无法将其取回。

Your exception is occurring not when you call getGeneratedKeys() , but when you call getLong(1) . 您的异常不是在调用getGeneratedKeys()时发生的,而是在调用getLong(1) It is occurring because getGeneratedKeys return a ResultSet, and like any ResultSet, you need to call generatedKeys.next() to point to a row of the ResultSet before accessing data. 发生这种情况是因为getGeneratedKeys返回一个ResultSet,并且像任何ResultSet一样,您需要在访问数据之前调用generatedKeys.next()指向ResultSet的一行。 That is why the exception is generated by the driver's internal checkRowPos method. 因此,异常是由驱动程序的内部checkRowPos方法生成的。

long genId = 0;
ResultSet keys = stmt.getGeneratedKeys();
if (keys.next()) {
    genId = keys.getLong(1);
}

JDBC returns a ResultSet as you could have inserted several records. JDBC将返回一个ResultSet,因为您可能已经插入了多个记录。 And then you could have several generated keys per record. 然后,每个记录可以有几个生成的键。

So in the circumstantial tradition of JDBC, you need two steps further. 因此,在JDBC的传统情况下,您还需要两个步骤。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM