tl;dr
myPreparedStatement.setObject(
… ,
java.util.UUID.randomUUID()
)
Detail
(a) Tunjukkan kode Anda kepada kami.
PreparedStatement::setObject
tidak berfungsi saat meneruskan java.util.UUID
. Anda mungkin memiliki beberapa masalah lain dalam kode Anda.
(b) Lihat posting blog saya Nilai UUID Dari JDBC ke Postgres untuk sedikit diskusi dan contoh kode.
// Generate or obtain data to store in database.
java.util.UUID uuid = java.util.UUID.randomUUID(); // Generate a random UUID.
String foodName = "Croissant";
// JDBC Prepared Statement.
PreparedStatement preparedStatement = conn.prepareStatement( "INSERT INTO food_ (pkey_, food_name_ ) VALUES (?,?)" );
int nthPlaceholder = 1; // 1-based counting (not an index).
preparedStatement.setObject( nthPlaceholder++, uuid );
preparedStatement.setString( nthPlaceholder++, foodName );
// Execute SQL.
if ( !( preparedStatement.executeUpdate() == 1 ) ) {
// If the SQL reports other than one row inserted…
this.logger.error( "Failed to insert row into database." );
}
(c) Saya tidak yakin apa yang Anda maksud dengan
Driver Java JDBC terbaru untuk postgres mengklaim mendukung UUID secara asli
Sopir yang mana? Setidaknya ada dua driver JDBC open-source untuk Postgres, yang sekarang/lawas dan yang baru menulis ulang "generasi berikutnya". Dan ada juga driver komersial lainnya.
"asli"? Bisakah Anda menautkan ke dokumentasi yang Anda baca? Spesifikasi SQL tidak memiliki tipe data untuk UUID (sayangnya ), oleh karena itu spesifikasi JDBC tidak memiliki tipe data untuk UUID. Sebagai solusinya, driver JDBC untuk Postgres menggunakan setObject
dan getObject
metode pada PreparedStatement memindahkan UUID melintasi jurang antara Java SQL Postgres. Lihat contoh kode di atas.
Seperti yang dikatakan oleh dokumen JDBC PreparedStatement:
Jika konversi tipe parameter arbitrer diperlukan, metode setObject harus digunakan dengan tipe SQL target.
Mungkin dengan "asli", Anda mengacaukan dukungan asli Postgres untuk UUID sebagai tipe data dengan JDBC yang memiliki tipe data UUID. Postgres memang mendukung UUID sebagai tipe data, yang berarti nilainya disimpan sebagai 128-bit daripada beberapa kali jika disimpan sebagai string hex ASCII atau Unicode. Dan menjadi asli juga berarti Postgres tahu cara membuat indeks pada kolom jenis itu.
Inti dari posting blog saya yang disebutkan di atas adalah bahwa saya sangat terkejut dengan betapa sederhananya menjembatani jurang antara Java ↔ SQL ↔ Postgres
. Dalam upaya pertama saya yang tidak berpendidikan, saya bekerja terlalu keras.
Catatan lain tentang Postgres yang mendukung UUID… Postgres mengetahui cara menyimpan, mengindeks, dan mengambil nilai UUID yang ada. Untuk menghasilkan Nilai UUID, Anda harus mengaktifkan ekstensi Postgres (plugin) uuid-ossp
. Ekstensi ini membungkus perpustakaan yang disediakan oleh Proyek OSSP untuk menghasilkan berbagai jenis nilai UUID. Lihat blog saya untuk petunjuk.
Omong-omong…
Jika saya tahu bagaimana mengajukan petisi kepada kelompok ahli JDBC atau tim JSR untuk membuat JDBC mengetahui UUID, saya pasti akan melakukannya. Mereka melakukan hal itu untuk tipe tanggal-waktu baru yang ditentukan di JSR 310:API Tanggal dan Waktu.
Demikian pula, jika saya tahu bagaimana mengajukan petisi kepada komite standar SQL untuk menambahkan tipe data UUID, saya akan melakukannya. Tapi ternyata komite itu lebih tertutup daripada Politbiro Soviet dan lebih lambat dari gletser.