SpringJdbcPreparedステートメントを使用してレコードをテーブルに挿入しようとしています。このコードは、PostgresとOracleで実行する必要があります。挿入後、挿入したレコードキーを読み取る必要があります。
SpringドキュメントのJDBCの章で以下のコードを見つけましたが、「これはOracleで動作します」と書かれています。
こちらのリンクを参照してください(セクション12.2.8)。
これはPostgresでうまく機能し、レコードを挿入し、挿入されたレコードキーをkeyHolderで読み取ることができます。ただし、Oracleでは、以下のエラーメッセージで失敗します...
[junit] STDOUT [ERROR] [2011.11.0401:26:04].....-テスト......失敗しました。[junit]メッセージ:PreparedStatementCallback; SQL []; ORA-01400:("SOME_USER"。"SOME_TABLE"。"ID")[junit]にNULLを挿入できません。ネストされた例外はjava.sql.SQLIntegrityConstraintViolationExceptionです:ORA-01400:NULLを("SOME_USER"。"SOME_TABLE"。"ID")に挿入できません
これがコードです...
KeyHolder keyHolder = new GeneratedKeyHolder();
jdbcTemplate.update(new PreparedStatementCreator()
{
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException
{
PreparedStatement ps = connection.prepareStatement("insert into some_table(xxx_name,xxx_date), new String[] { "id" });
ps.setString(1, "some name");
ps.setDate(2, "some date");
return ps;
}
}, keyHolder);
注:私はojdbc6.jar(Oracle jdbc jar)、commonsdbcpjarを使用しています
これがapplicationContextdataSourceBeanです
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${db.driver}" />
<property name="url" value="${db.url}" />
<property name="username" value="${db.username}" />
<property name="password" value="${db.password}" />
</bean>
テーブルには、PostgresとOracleの両方にシーケンスがありますsome_table_id_seq
。このコードをPostgres(開発マシンで実行)とOracle(本番で実行)で機能させる必要があります。どんな助け/アイデアもありがたいです。ありがとうございました。