Saya sebenarnya telah menggunakan cara yang lebih sederhana daripada yang dengan PGObject dan Converters. Karena di Postgres enum dikonversi secara alami ke-dari teks, Anda hanya perlu membiarkannya melakukan yang terbaik. Saya akan meminjam contoh suasana hati Arjan, jika dia tidak keberatan:
Jenis enum di Postgres:
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
Kelas dan enum di Java:
public @Entity class Person {
public static enum Mood {sad, ok, happy};
@Enumerated(EnumType.STRING)
Mood mood;
}
Tag @Enumerated itu mengatakan bahwa serialisasi/deserialisasi enum harus dilakukan dalam teks. Tanpa itu, ia menggunakan int, yang lebih merepotkan daripada apa pun.
Pada titik ini Anda memiliki dua pilihan. Anda juga:
-
Tambahkan stringtype=unspecified ke string koneksi, seperti yang dijelaskan dalam parameter koneksi JDBC. Ini memungkinkan Postgres menebak tipe sisi kanan dan mengonversi semuanya secara memadai, karena ia menerima sesuatu seperti 'enum =tidak diketahui', yang merupakan ekspresi yang sudah diketahuinya apa yang harus dilakukan (feed nilai ? ke deserialiser tipe kiri). Ini adalah opsi yang disukai, karena seharusnya berfungsi untuk semua UDT sederhana seperti enum sekaligus.
jdbc:postgresql://localhost:5432/dbname?stringtype=unspecified
Atau:
-
Buat konversi implisit dari varchar ke enum di database. Jadi dalam kasus kedua ini database menerima beberapa penugasan atau perbandingan seperti 'enum =varchar' dan ia menemukan aturan dalam katalog internalnya yang mengatakan bahwa ia dapat melewatkan nilai tangan kanan melalui fungsi serialisasi varchar diikuti oleh fungsi deserialisasi dari jumlah Itu lebih banyak langkah daripada yang dibutuhkan; dan memiliki terlalu banyak pemeran implisit dalam katalog dapat menyebabkan kueri sewenang-wenang memiliki interpretasi yang ambigu, jadi gunakan dengan hemat. Pembuatan pemerannya adalah:
BUAT PEMAIN (KARAKTER BERVARIASI sesuai mood) TANPA INOUT SEBAGAI IMPLIKIT;
Harus bekerja hanya dengan itu.