java.sql.SQLException:未请求生成的密钥。在 JBoss
java.sql.SQLException: Generated keys not requested. in JBoss
我有基于 struts 的应用程序 运行 在 Wildfly 9.0.1.Final 上,数据库是 MySQL。
早些时候代码使用 运行 没有任何错误。当时JBoss版本是4.0.4.GA.
现在我已经在 Wildfly 9.0 上部署了代码。1.Final 添加一些新行时出现错误。
堆栈跟踪:
Caused by: java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement().
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:998)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:937)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:872)
at com.mysql.jdbc.StatementImpl.getGeneratedKeys(StatementImpl.java:1803)
at org.jboss.jca.adapters.jdbc.WrappedStatement.getGeneratedKeys(WrappedStatement.java:1105)
at com.aldorsolutions.webfdms.database.DatabasePeer.insert(DatabasePeer.java:90)
... 48 more
代码:
try {
pstmt = getInsertSql((DatabaseTransaction)t,p);
pstmt.executeUpdate(); // Execute the SQL
ResultSet rs = pstmt.getGeneratedKeys();
// ResultSet rs = stmt.executeQuery("SELECT @@IDENTITY");
if (rs.next()) {
autoinc = rs.getInt(1);
p.setId(autoinc);
}
} catch( SQLException e ) {
// logger.error("SQLException in DatabasePeer.save: ", e);
throw new PersistenceException("PersistentObj:" + p.getClass().getName() + " Message: " + e.getMessage(), e);
}
getInsertSql() 的代码:
try {
DbSpeedData item=(DbSpeedData)p;
connection = t.getConnection();
pstmt = connection.prepareStatement(
"INSERT INTO speeddata (Identity, TabCategory, Locale, " +
"LocationId, TabData, SortSequence) VALUES (0,?,?,?,?,?)");
pstmt.setString(1, item.getCategory());
pstmt.setInt (2, item.getLocale());
pstmt.setInt (3, item.getLocationId());
pstmt.setString(4, item.getData());
pstmt.setInt (5, item.getSortSequence());
return pstmt;
}
catch (java.sql.SQLException e){
throw new com.aldorsolutions.webfdms.database.PersistenceException("DbSpeedDataPeer.Insert",e);
}
我用谷歌搜索,发现我需要添加
Statement.RETURN_GENERATED_KEYS
到 pstmt.executeUpdate();
.
但是之前的代码在 JBoss 4.0.4.GA 上正确使用 运行,我根本没有更改代码。唯一的变化是 JBoss 升级到 Wildfly。
可能是什么问题?
请帮忙。
你能包含 getInsertSql
的代码吗?
您需要在创建 PreparedStatement
时传递 Statement.RETURN_GENERATED_KEYS
选项。例如:
pstmt = connection.prepareStatement(
"INSERT INTO speeddata (Identity, TabCategory, Locale, " +
"LocationId, TabData, SortSequence) VALUES (0,?,?,?,?,?)",
Statement.RETURN_GENERATED_KEYS
);
我有基于 struts 的应用程序 运行 在 Wildfly 9.0.1.Final 上,数据库是 MySQL。 早些时候代码使用 运行 没有任何错误。当时JBoss版本是4.0.4.GA.
现在我已经在 Wildfly 9.0 上部署了代码。1.Final 添加一些新行时出现错误。
堆栈跟踪:
Caused by: java.sql.SQLException: Generated keys not requested. You need to specify Statement.RETURN_GENERATED_KEYS to Statement.executeUpdate() or Connection.prepareStatement().
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:998)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:937)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:872)
at com.mysql.jdbc.StatementImpl.getGeneratedKeys(StatementImpl.java:1803)
at org.jboss.jca.adapters.jdbc.WrappedStatement.getGeneratedKeys(WrappedStatement.java:1105)
at com.aldorsolutions.webfdms.database.DatabasePeer.insert(DatabasePeer.java:90)
... 48 more
代码:
try {
pstmt = getInsertSql((DatabaseTransaction)t,p);
pstmt.executeUpdate(); // Execute the SQL
ResultSet rs = pstmt.getGeneratedKeys();
// ResultSet rs = stmt.executeQuery("SELECT @@IDENTITY");
if (rs.next()) {
autoinc = rs.getInt(1);
p.setId(autoinc);
}
} catch( SQLException e ) {
// logger.error("SQLException in DatabasePeer.save: ", e);
throw new PersistenceException("PersistentObj:" + p.getClass().getName() + " Message: " + e.getMessage(), e);
}
getInsertSql() 的代码:
try {
DbSpeedData item=(DbSpeedData)p;
connection = t.getConnection();
pstmt = connection.prepareStatement(
"INSERT INTO speeddata (Identity, TabCategory, Locale, " +
"LocationId, TabData, SortSequence) VALUES (0,?,?,?,?,?)");
pstmt.setString(1, item.getCategory());
pstmt.setInt (2, item.getLocale());
pstmt.setInt (3, item.getLocationId());
pstmt.setString(4, item.getData());
pstmt.setInt (5, item.getSortSequence());
return pstmt;
}
catch (java.sql.SQLException e){
throw new com.aldorsolutions.webfdms.database.PersistenceException("DbSpeedDataPeer.Insert",e);
}
我用谷歌搜索,发现我需要添加
Statement.RETURN_GENERATED_KEYS
到 pstmt.executeUpdate();
.
但是之前的代码在 JBoss 4.0.4.GA 上正确使用 运行,我根本没有更改代码。唯一的变化是 JBoss 升级到 Wildfly。
可能是什么问题? 请帮忙。
你能包含 getInsertSql
的代码吗?
您需要在创建 PreparedStatement
时传递 Statement.RETURN_GENERATED_KEYS
选项。例如:
pstmt = connection.prepareStatement(
"INSERT INTO speeddata (Identity, TabCategory, Locale, " +
"LocationId, TabData, SortSequence) VALUES (0,?,?,?,?,?)",
Statement.RETURN_GENERATED_KEYS
);