Estou procurando as diferentes maneiras de mapear uma enumeração usando JPA. Quero especialmente definir o valor inteiro de cada entrada de enum e salvar apenas o valor inteiro.
@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;
}
Uma solução simples é usar a anotação enumerada com EnumType.ORDINAL:
@Column(name = "RIGHT")
@Enumerated(EnumType.ORDINAL)
private Right right;
Mas, neste caso, o JPA mapeia o índice de enumeração (0,1,2) e não o valor que eu quero (100,200,300).
As duas soluções que encontrei não parecem simples ...
Primeira solução
Uma solução, proposta aqui , usa @PrePersist e @PostLoad para converter a enumeração em outro campo e marcar a enumeração como transitória:
@Basic
private int intValueForAnEnum;
@PrePersist
void populateDBFields() {
intValueForAnEnum = right.getValue();
}
@PostLoad
void populateTransientFields() {
right = Right.valueOf(intValueForAnEnum);
}
Segunda solução
A segunda solução proposta aqui propôs um objeto de conversão genérico, mas ainda parece pesado e orientado a hibernação (o @Type não parece existir no 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")
}
)
Existem outras soluções?
Tenho várias idéias em mente, mas não sei se elas existem no JPA:
- use os métodos setter e getter do membro certo da classe Authority ao carregar e salvar o objeto Authority
- uma idéia equivalente seria dizer à JPA quais são os métodos de enum Right para converter enum em int e int enum
- Como estou usando o Spring, há alguma maneira de dizer ao JPA para usar um conversor específico (RightEditor)?