Je recherche les différentes façons de mapper une énumération à l'aide de JPA. Je souhaite en particulier définir la valeur entière de chaque entrée d'énumération et ne sauvegarder que la valeur entière.
@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;
}
Une solution simple consiste à utiliser l'annotation Enumerated avec EnumType.ORDINAL:
@Column(name = "RIGHT")
@Enumerated(EnumType.ORDINAL)
private Right right;
Mais dans ce cas, JPA mappe l'index d'énumération (0,1,2) et non la valeur que je veux (100,200,300).
Les deux solutions que j'ai trouvées ne me semblent pas simples ...
Première solution
Une solution, proposée ici , utilise @PrePersist et @PostLoad pour convertir l'énumération en un autre champ et marquer le champ enum comme transitoire:
@Basic
private int intValueForAnEnum;
@PrePersist
void populateDBFields() {
intValueForAnEnum = right.getValue();
}
@PostLoad
void populateTransientFields() {
right = Right.valueOf(intValueForAnEnum);
}
Deuxième solution
La deuxième solution proposée ici proposait un objet de conversion générique, mais semble toujours lourd et orienté hibernation (@Type ne semble pas exister en 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")
}
)
Y a-t-il d'autres solutions?
J'ai plusieurs idées en tête mais je ne sais pas si elles existent dans JPA:
- utiliser les méthodes setter et getter du membre droit de la classe d'autorité lors du chargement et de l'enregistrement de l'objet Authority
- une idée équivalente serait de dire à JPA quelles sont les méthodes de Right enum pour convertir enum en int et int en enum
- Étant donné que j'utilise Spring, existe-t-il un moyen de dire à JPA d'utiliser un convertisseur spécifique (RightEditor)?