2017-06-20 14 views
0

我試圖在Oracle DB中插入一條記錄並獲取序列標識(也是該表的主鍵)以供進一步使用。我搜索了一下SO鏈接,發現了一些代碼片段,並且一直在嘗試它們,但在Oracle DB中插入記錄時看到以下錯誤。使用Spring的JdbcTemplate無法獲取在數據庫中插入的最後一個序列ID

錯誤

Exception in thread "main" org.springframework.dao.DataRetrievalFailureException: The generated key is not of a supported numeric type. Unable to cast [oracle.sql.ROWID] to [java.lang.Number] 
    at org.springframework.jdbc.support.GeneratedKeyHolder.getKey(GeneratedKeyHolder.java:73) 
    at com.ebayenterprise.publicapi.events.dao.DBConnectionUtils.insertEventLogData2(DBConnectionUtils.java:88) 
    at com.ebayenterprise.publicapi.events.dao.DBConnectionUtils.main(DBConnectionUtils.java:42) 

程序方法

private static void insertEventLogData2() { 
     //setup data 
     EventType eventType = new EventType(EVENT_TYPE_ID, EVENT_TYPE_CD, null, null); 
     Timestamp currentTimestamp = new Timestamp(System.currentTimeMillis()); 
     final EventLog eventLog = new EventLog(eventType, ROUTE_ID, ORDER_ID, null, null, currentTimestamp, currentTimestamp); 
     System.out.println("eventLog = " + eventLog); 

     //execute query 
     GeneratedKeyHolder holder = new GeneratedKeyHolder(); 
     jdbcTemplate.update(new PreparedStatementCreator() { 
      @Override 
      public PreparedStatement createPreparedStatement(Connection con) throws SQLException { 
       PreparedStatement statement = con.prepareStatement(INSERT_EVENT_LOG_MESSAGE_SQL, Statement.RETURN_GENERATED_KEYS); 
       statement.setInt(1, eventLog.getRouteId()); 
       statement.setInt(2, eventLog.getEventType().getEventTypeId()); 
       statement.setString(3, eventLog.getOrderId()); 
       statement.setTimestamp(4, eventLog.getIncomingEventTimestamp()); 
       statement.setTimestamp(5, eventLog.getOutgoingEventTimestamp()); 
       return statement; 
      } 
     }, holder); 

     //get the sequence key 
     long generatedEventId = holder.getKey().longValue(); 
     System.out.println("generatedEventId = " + generatedEventId); 
    } 

表說明:

EVENT_ID (Primary Key - Mapped to sequence EVENT_ID_SEQ) 
ROUTE_ID 
EVENT_TYPE_ID 
ORDER_ID 
INCOMING_EVENT_TIMESTAMP 
OUTGOING_EVENT_TIMESTAMP 

回答

0

沒關係。通過NamedParameterJdbcTemplate得到它的工作。更清潔的實施也是如此。

private static final String INSERT_EVENT_LOG_MESSAGE_SQL2 = "INSERT INTO " 
     + "EVENT_LOG (EVENT_ID, ROUTE_ID, EVENT_TYPE_ID, ORDER_ID, INCOMING_EVENT_TIMESTAMP, OUTGOING_EVENT_TIMESTAMP) " 
     + "VALUES (EVENT_LOG_ID_SEQ.NEXTVAL, :routeId, :eventTypeId, :orderId, :incomingEventTS, :outgoingEventTS)"; 


private static void insertEventLogData() { 
     //setup data 
     EventType eventType = new EventType(EVENT_TYPE_ID, EVENT_TYPE_CD, null, null); 
     Timestamp currentTimestamp = new Timestamp(System.currentTimeMillis()); 
     EventLog eventLog = new EventLog(eventType, ROUTE_ID, ORDER_ID, null, null, currentTimestamp, currentTimestamp); 
     System.out.println("eventLog = " + eventLog); 

     MapSqlParameterSource parameters = new MapSqlParameterSource(); 
     parameters.addValue("routeId", ROUTE_ID); 
     parameters.addValue("eventTypeId", EVENT_TYPE_ID); 
     parameters.addValue("orderId", ORDER_ID); 
     parameters.addValue("incomingEventTS", currentTimestamp); 
     parameters.addValue("outgoingEventTS", currentTimestamp); 

     GeneratedKeyHolder holder = new GeneratedKeyHolder(); 
     int nb = namedJdbcTemplate.update(INSERT_EVENT_LOG_MESSAGE_SQL2, parameters, holder, new String[]{"EVENT_ID"}); 

     //get the sequence key 
     long generatedEventId = holder.getKey().longValue(); 
     System.out.println("generatedEventId = " + generatedEventId); 
    } 
相關問題