Saya mencari berbagai cara untuk memetakan enum menggunakan JPA. Saya terutama ingin mengatur nilai integer dari setiap entri enum dan hanya menyimpan nilai integer.
@Entity
@Table(name = "AUTHORITY_")
public class Authority implements Serializable {
public enum Right {
READ(100), WRITE(200), EDITOR (300);
private int value;
Right(int value) { this.value = value; }
public int getValue() { return value; }
};
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "AUTHORITY_ID")
private Long id;
// the enum to map :
private Right right;
}
Solusi sederhana adalah dengan menggunakan anotasi Enumerated dengan EnumType.ORDINAL:
@Column(name = "RIGHT")
@Enumerated(EnumType.ORDINAL)
private Right right;
Tetapi dalam hal ini JPA memetakan indeks enum (0,1,2) dan bukan nilai yang saya inginkan (100,200,300).
Dua solusi yang saya temukan sepertinya tidak sederhana ...
Solusi Pertama
Solusi, diusulkan di sini , menggunakan @PrePersist dan @PostLoad untuk mengonversi enum ke bidang lain dan menandai bidang enum sebagai transien:
@Basic
private int intValueForAnEnum;
@PrePersist
void populateDBFields() {
intValueForAnEnum = right.getValue();
}
@PostLoad
void populateTransientFields() {
right = Right.valueOf(intValueForAnEnum);
}
Solusi Kedua
Solusi kedua yang diusulkan di sini mengusulkan objek konversi generik, tetapi masih tampak berat dan berorientasi hibernasi (@Type sepertinya tidak ada di Java EE):
@Type(
type = "org.appfuse.tutorial.commons.hibernate.GenericEnumUserType",
parameters = {
@Parameter(
name = "enumClass",
value = "Authority$Right"),
@Parameter(
name = "identifierMethod",
value = "toInt"),
@Parameter(
name = "valueOfMethod",
value = "fromInt")
}
)
Apakah ada solusi lain?
Saya memiliki beberapa ide tetapi saya tidak tahu apakah mereka ada di JPA:
- menggunakan metode setter dan pengambil dari anggota kanan dari Kelas Otoritas saat memuat dan menyimpan objek Otoritas
- ide yang setara adalah untuk memberi tahu JPA apa metode Right enum untuk mengonversi enum ke int dan int ke enum
- Karena saya menggunakan Spring, apakah ada cara untuk memberitahu JPA untuk menggunakan konverter tertentu (RightEditor)?