Suresh Atta
Suresh Atta

Reputation: 121998

Getting autoincremented Id from JDBC

Facing some exception without any clue message.

Here is my 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.

Upvotes: 0

Views: 127

Answers (2)

Joop Eggen
Joop Eggen

Reputation: 109547

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. And then you could have several generated keys per record.

So in the circumstantial tradition of JDBC, you need two steps further.

Upvotes: 1

VGR
VGR

Reputation: 44308

Your exception is occurring not when you call getGeneratedKeys(), but when you call 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. That is why the exception is generated by the driver's internal checkRowPos method.

Upvotes: 3

Related Questions