MySQLテーブルに行を挿入しようとしましたが、そのIDが挿入されています。私は、MySQLのlast_insert_id()
関数を知っている、私はそれを動作させるように見えることはできません。現在、トランザクションとして注釈を付けられた関数を使用しようとしていますが、返されるのは0だけです。私はSpring 3.1を使用しています。Spring JdbcTemplateがMySQLからInsert IDを取得できない
SELECT LAST_INSERT_ID()
MySQLテーブルに行を挿入しようとしましたが、そのIDが挿入されています。私は、MySQLのlast_insert_id()
関数を知っている、私はそれを動作させるように見えることはできません。現在、トランザクションとして注釈を付けられた関数を使用しようとしていますが、返されるのは0だけです。私はSpring 3.1を使用しています。Spring JdbcTemplateがMySQLからInsert IDを取得できない
SELECT LAST_INSERT_ID()
Springのビルトインサポートあなた自身でそれをするよりも。
SqlUpdate insert = new SqlUpdate(ds, "INSERT INTO company (name) VALUES (?)");
insert.declareParameter(new SqlParameter(Types.VARCHAR));
insert.setReturnGeneratedKeys(true);
// assuming auto-generated col is named 'id'
insert.setGeneratedKeysColumnNames(new String[] {"id"});
insert.compile();
....
GeneratedKeyHolder keyHolder = new GeneratedKeyHolder();
insert.update(new Object[]{"test"}, keyHolder);
System.out.println(keyHolder.getKey().longValue());
The documentationが最後のインサートIDを取得するための構文であることを明らかにし、ここでhttp://www.codefutures.com/spring-dao/
public int createCompany(Company company) throws SQLException {
jdbcTemplate.update(
"INSERT INTO company (name) VALUES (?)",
company.getName()
);
return jdbcTemplate.queryForInt("select last_insert_id()");
}
から取ら
@Transactional (propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
private long insertTransactionRecord
(
int custID,
int porID,
String date,
short crvID
) {
m_template.update ("INSERT INTO " +
" transaction " +
"(" +
" por_id, " +
" cust_id, " +
" trans_date, " +
" crv_id " +
") " +
"VALUES " +
"(" +
" ?, " +
" ?, " +
" ?, " +
" ? " +
")",
new Object[] {
porID,
custID,
date,
crvID
});
return m_template.queryForLong ("SELECT " +
" last_insert_id() " +
"FROM " +
" transaction " +
"LIMIT 1");
}
用途:あなたは何FROM
が
春にはマニュアルの例もあります:http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/html/jdbc.html#jdbc-auto-genereted-keys – Christian
'FROM'句の目的は、IDを取得するテーブルを指定することです。 'JdbcTemplate'は接続プーリングを使用するので、同じ接続であることが保証されていません。取引はこれを是正することになっていました。あなたの提案は助けにはなりませんでした。 – Nik
jdbcTemplate.queryForObject( "select last_insert_id()"、Integer.class)を使用してください – singhspk
私はアプローチがスレッドセーフではないと思いますか? queryForInt(..)呼び出しは、複数の挿入が行われた後に実行され、その上の挿入ステートメントに間違ったIDを返します。 –