Я шукаю різні способи відображення перерахунків за допомогою JPA. Я особливо хочу встановити ціле значення кожного запису enum і зберегти лише ціле значення.
@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;
}
Простим рішенням є використання переліченої анотації з EnumType.ORDINAL:
@Column(name = "RIGHT")
@Enumerated(EnumType.ORDINAL)
private Right right;
Але в цьому випадку JPA відображає індекс перерахунку (0,1,2), а не значення, яке я хочу (100,200,300).
Два знайдених мною рішення не здаються простими ...
Перше рішення
Розчин, запропонований тут , використовує @PrePersist і @PostLoad для перетворення перерахування на інше поле і відзначте поле перечислимого в якості перехідного процесу :
@Basic
private int intValueForAnEnum;
@PrePersist
void populateDBFields() {
intValueForAnEnum = right.getValue();
}
@PostLoad
void populateTransientFields() {
right = Right.valueOf(intValueForAnEnum);
}
Друге рішення
Друге запропоноване тут рішення запропонувало об'єкт загального перетворення, але все ще здається важким та орієнтованим на сплячку (@Type, здається, не існує у 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")
}
)
Чи є інші рішення?
Я маю на увазі кілька ідей, але не знаю, чи існують вони в JPA:
- використовуйте методи встановлення та отримання для правого члена класу повноважень під час завантаження та збереження об'єкта влади
- еквівалентною ідеєю було б сказати JPA, які методи Right enum для перетворення enum в int та int в enum
- Оскільки я використовую Spring, чи є спосіб сказати JPA використовувати певний перетворювач (RightEditor)?