Я пытаюсь использовать оператор Spring Jdbc Prepared для вставки записей в таблицу.Этот код должен работать на Postgres и Oracle.Мне нужно прочитать вставленный ключ записи после вставки.
Я нашел нижеприведенный код в главе JDBC документации Spring, где написано "это работает с Oracle".
См. Ссылку здесь (раздел 12.2.8).
Хорошо работает на Postgres, вставляет запись, и я могу прочитать вставленный ключ записи с помощью keyHolder.Однако в Oracle происходит сбой с сообщением об ошибке ниже ...
[junit] STDOUT [ОШИБКА] [2011.11.04 01:26:04] ..... - Тест ...... не удалось.[junit] Сообщение: PreparedStatementCallback;SQL [];ORA-01400: невозможно вставить NULL в ("SOME_USER". "SOME_TABLE". "ID") [junit];вложенное исключение: 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), dbcp jar commons
Вот здесь applicationContext dataSource bean
<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 (работает на производстве).Любая помощь / идеи приветствуются.Спасибо.