Estoy buscando las diferentes formas de mapear una enumeración usando JPA. Especialmente quiero establecer el valor entero de cada entrada de enumeración y guardar solo el valor entero.
@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 solución simple es usar la anotación enumerada con EnumType.ORDINAL:
@Column(name = "RIGHT")
@Enumerated(EnumType.ORDINAL)
private Right right;
Pero en este caso, JPA asigna el índice de enumeración (0,1,2) y no el valor que quiero (100,200,300).
Las dos soluciones que encontré no parecen simples ...
Primera solución
Una solución, propuesta aquí , utiliza @PrePersist y @PostLoad para convertir la enumeración a otro campo y marcar el campo de enumeración como transitorio:
@Basic
private int intValueForAnEnum;
@PrePersist
void populateDBFields() {
intValueForAnEnum = right.getValue();
}
@PostLoad
void populateTransientFields() {
right = Right.valueOf(intValueForAnEnum);
}
Segunda solución
La segunda solución propuesta aquí propuso un objeto de conversión genérico, pero aún parece pesado y orientado a la hibernación (@Type no parece existir 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")
}
)
¿Hay alguna otra solución?
Tengo varias ideas en mente pero no sé si existen en JPA:
- use los métodos setter y getter del miembro correcto de la clase de autoridad al cargar y guardar el objeto de autoridad
- una idea equivalente sería decirle a JPA cuáles son los métodos de Right enum para convertir enum a int e int a enum
- Debido a que estoy usando Spring, ¿hay alguna forma de decirle a JPA que use un convertidor específico (RightEditor)?