java - oracle11g 和 JDBC 中的自动增量

标签 java oracle jdbc driver prepared-statement

我正在开发一个连接到 Oracle 11g 数据库的应用程序,使用 ojdbc6 作为 JDBC 驱动程序。我为需要添加值的表创建了一个触发器和一个序列,以便该表的 ID 列自动递增。当我使用 SQL Developper 在数据库中手动添加新行时,一切正常(我的自动增量序列和触发器工作良好)。但是当我从 Java 应用程序中添加新行时,我收到以下错误:

java.sql.SQLRecoverableException: internal error at oracle.jdbc.driver.OraclePreparedStatement.setupBindBuffers(OraclePre paredStatement.java:3071) at oracle.jdbc.driver.OraclePreparedStatement.processCompletedBindRow(Or aclePreparedStatement.java:2247) at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePrep aredStatement.java:3444) at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePrepar edStatement.java:3530) at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(Oracl ePreparedStatementWrapper.java:1350)

这是我的 Java 代码:

String query = "INSERT INTO USER (ID, USERNAME, PASSWORD, FIRSTNAME, LASTNAME, EMAIL) VALUES (?, ?, ?, ?, ?, ?)";
        PreparedStatement preparedStatement = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
        preparedStatement.setString(2, user.getUsername());
        preparedStatement.setString(3, user.getPassword());
        preparedStatement.setString(4, user.getFirstName());
        preparedStatement.setString(5, user.getFirstName());
        preparedStatement.setString(6, user.getEmail());

        preparedStatement.executeUpdate();

我没有为我的序列和触发器添加代码,因为我认为问题不是来自数据库,因为 sqldevelopper 一切正常。 我还尝试直接使用我的序列,例如:

String query = "INSERT INTO USER (ID, USERNAME, PASSWORD, FIRSTNAME, LASTNAME, EMAIL) VALUES (SEQUENCE.NEXTVAL, ?, ?, ?, ?, ?)";

但这也失败了

有人可以帮我解决这个问题吗?

最佳答案

不要从客户端发送ID,让触发器处理ID:

String query = "INSERT INTO USER (USERNAME, PASSWORD, FIRSTNAME, LASTNAME, EMAIL)"
  + " VALUES (?, ?, ?, ?, ?)";

PreparedStatement preparedStatement = connection.prepareStatement(query, Statement.RETURN_GENERATED_KEYS);
preparedStatement.setString(1, user.getUsername());
preparedStatement.setString(2, user.getPassword());
preparedStatement.setString(3, user.getFirstName());
preparedStatement.setString(4, user.getFirstName());
preparedStatement.setString(5, user.getEmail());

preparedStatement.executeUpdate();

关于java - oracle11g 和 JDBC 中的自动增量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18284049/

相关文章:

java - JPA2 缓存或 hibernate 缓存

java - GPU 上的内存大小分配 - opengl 纹理加载问题

oracle - Oracle是否有两个ESB产品: Aqualogic Service Bus AND Oracle Service Bus or did ALSB get merged into the Oracle SB product?

java - 无法写入 MySQL 时重置连接

java - 如何在 spring-boot 中使用 2 个或更多 jdbcTemplate?

java - 云端数值计算环境? [ 本科项目 ]

java - Spring Inject/AutoWire 在运行时创建的 Groovy 类

oracle - Entity Framework 忽略架构

sql-server - 数据库层的业务逻辑

java - 如何将从用户在运行时获取的字符串格式的日期转换为日期格式以将其输入数据库