2016-02-27 2 views
3

Мой создания таблицы выглядит следующим образом:rs.getGeneratedKeys() не работает в Дерби

public final String CREATE_QUESTIONS_TABLE = "CREATE TABLE Questions(QuestionID INTEGER PRIMARY KEY GENERATED ALWAYS AS IDENTITY," 
     + "SubmittedTime TIMESTAMP NOT NULL," 
     + "Title VARCHAR(50) NOT NULL," 
     + "Text VARCHAR(300) NOT NULL," 
     + "Username VARCHAR(10) NOT NULL," 
     + "Rating INTEGER DEFAULT 0 NOT NULL)"; 

Мой ВСТАВИТЬ запрос выглядит следующим образом:

public final String INSERT_QUESTION_STMT = "INSERT INTO Questions(SubmittedTime, Title, Text, Username) VALUES(?,?,?,?)"; 

Часть кода сервлета, где я вставить выглядит это:

// insert question into database 
PreparedStatement pstmt = conn.prepareStatement(AppConstants.INSERT_QUESTION_STMT); 
pstmt.setTimestamp(1, new Timestamp(System.currentTimeMillis())); 
pstmt.setString(2, newQuestion.getTitle()); 
pstmt.setString(3, newQuestion.getText()); 
pstmt.setString(4, (String)session.getAttribute("username")); 
pstmt.executeUpdate(); 

До сих пор все работает, и он вставляет вопрос в базу данных.

Я хочу, чтобы получить автоматически сгенерированный идентификатор вопроса, хотя так я попытался с помощью:

ResultSet rs = pstmt.getGeneratedKeys(); 
int id = -1; 
if(rs.next()) 
id = rs.getInt(1); 

я получаю случайную ошибку на rs.next()

SEVERE: Servlet.service() for servlet [AskQuestion] in context with path [/QnA] threw exception 
java.lang.NullPointerException 
at QnA.servlets.AskQuestion.doPost(AskQuestion.java:78) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) 
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Unknown Source) 

Любая идея, почему это не работает?

ответ

5

Я нашел ответ, я должен был сказать инструкции, чтобы вернуть сгенерированные ключи.

PreparedStatement pstmt = conn.prepareStatement(AppConstants.INSERT_QUESTION_STMT, 
     Statement.RETURN_GENERATED_KEYS); 

Обратите внимание на Statement.RETURN_GENERATED_KEYS в качестве второго аргумента функции.

+0

спасибо за редактирование темы + jdbc (он по-прежнему работает с PreparedStatement.RETURN_GENERATED_KEYS, хотя по какой-либо причине предпочитают один за другим?) – ImZyzzBrah

+0

Это потому, что 'PreparedStatement' расширяет' Statement', поэтому он также наследует определенные константы. Использование 'Statement' для констант является предпочтительным, потому что 1) это то, где константа фактически определена, и 2) стандарт JDBC, документация и т. Д. Использует' Statement.RETURN_GENERATED_KEYS'. –

+0

благодарит за разъяснения – ImZyzzBrah

Смежные вопросы