Any advice on how to read auto-incrementing identity field assigned to newly created record from call through java.sql.Statement.executeUpdate
?
I know h
I've always had to make a second call using query after the insert.
You could use an ORM like hibernate. I think it does this stuff for you.
@ScArcher2
Making a second call is extremely dangerous. The process of INSERT
ing and selecting the resultant auto-generated keys must be atomic, otherwise you may receive inconsistent results on the key select. Consider two asynchronous INSERT
s where they both complete before either has a chance to select the generated keys. Which process gets which list of keys? Most cross-database ORMs have to do annoying things like in-process thread locking in order to keep results deterministic. This is not something you want to do by hand, especially if you are using a database which does support atomic generated key retrieval (HSQLDB is the only one I know of which does not).
The following snibblet of code should do ya':
PreparedStatement stmt = conn.prepareStatement(sql,
Statement.RETURN_GENERATED_KEYS);
// ...
ResultSet res = stmt.getGeneratedKeys();
while (res.next())
System.out.println("Generated key: " + res.getInt(1));
This is known to work on the following databases
For databases where it doesn't work (HSQLDB, Oracle, PostgreSQL, etc), you will need to futz with database-specific tricks. For example, on PostgreSQL you would make a call to SELECT NEXTVAL(...)
for the sequence in question.
Note that the parameters for executeUpdate(...)
are analogous.
ResultSet keys = statement.getGeneratedKeys();
Later, just iterate over ResultSet.
@ScArcher2 : I agree, Hibernate needs to make a second call to get the newly generated identity UNLESS an advanced generator strategy is used (sequence, hilo...)