Sto cercando i diversi modi per mappare un enum usando JPA. In particolare, voglio impostare il valore intero di ciascuna voce enum e salvare solo il valore intero.
@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;
}
Una soluzione semplice è utilizzare l'annotazione enumerata con EnumType.ORDINAL:
@Column(name = "RIGHT")
@Enumerated(EnumType.ORDINAL)
private Right right;
Ma in questo caso JPA mappa l'indice enum (0,1,2) e non il valore che desidero (100.200.300).
Le due soluzioni che ho trovato non sembrano semplici ...
Prima soluzione
Una soluzione, qui proposta , utilizza @PrePersist e @PostLoad per convertire l'enum in un altro campo e contrassegnare il campo enum come transitorio:
@Basic
private int intValueForAnEnum;
@PrePersist
void populateDBFields() {
intValueForAnEnum = right.getValue();
}
@PostLoad
void populateTransientFields() {
right = Right.valueOf(intValueForAnEnum);
}
Seconda soluzione
La seconda soluzione proposta qui proponeva un oggetto di conversione generico, ma sembra ancora pesante e orientato all'ibernazione (@Type non sembra esistere in 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")
}
)
Esistono altre soluzioni?
Ho in mente diverse idee ma non so se esistono nell'APP:
- utilizzare i metodi setter e getter del membro destro della classe di autorità durante il caricamento e il salvataggio dell'oggetto Authority
- un'idea equivalente sarebbe quella di dire all'APP quali sono i metodi di Right enum per convertire enum in int e int in enum
- Dato che sto usando Spring, c'è un modo per dire a JPA di usare un convertitore specifico (RightEditor)?