Szukam różnych sposobów mapowania wyliczenia za pomocą JPA. W szczególności chcę ustawić wartość całkowitą każdego wpisu wyliczenia i zapisać tylko wartość całkowitą.
@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;
}
Prostym rozwiązaniem jest użycie wyliczonej adnotacji w EnumType.ORDINAL:
@Column(name = "RIGHT")
@Enumerated(EnumType.ORDINAL)
private Right right;
Ale w tym przypadku JPA odwzorowuje indeks wyliczeniowy (0,1,2), a nie żądaną wartość (100,200,300).
Dwa znalezione przeze mnie rozwiązania nie wydają się proste ...
Pierwsze rozwiązanie
Proponowane tutaj rozwiązanie wykorzystuje @PrePersist i @PostLoad do konwersji wyliczenia na inne pole i oznaczenia pola wyliczenia jako przejściowe:
@Basic
private int intValueForAnEnum;
@PrePersist
void populateDBFields() {
intValueForAnEnum = right.getValue();
}
@PostLoad
void populateTransientFields() {
right = Right.valueOf(intValueForAnEnum);
}
Drugie rozwiązanie
Drugie zaproponowane tutaj rozwiązanie zaproponowało ogólny obiekt konwersji, ale nadal wydaje się ciężki i zorientowany na hibernację (@Type wydaje się nie istnieć w 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")
}
)
Czy są jakieś inne rozwiązania?
Mam na myśli kilka pomysłów, ale nie wiem, czy istnieją one w JPA:
- używaj metody ustawiającej i pobierającej prawego członka klasy klasy Authority podczas ładowania i zapisywania obiektu klasy Authority
- równoważnym pomysłem byłoby poinformowanie JPA, jakie są metody Right enum do konwersji enum na int i int na enum
- Ponieważ używam Springa, czy jest jakiś sposób, aby powiedzieć JPA, aby używał określonego konwertera (RightEditor)?