Я ищу различные способы сопоставления перечисления с помощью JPA. Я особенно хочу установить целочисленное значение каждой записи перечисления и сохранить только целочисленное значение.
@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;
}
Простым решением является использование Enumerated аннотации с 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:
- используйте методы setter и getter правого члена класса полномочий при загрузке и сохранении объекта Authority.
- эквивалентная идея заключалась бы в том, чтобы сообщить JPA, каковы методы Right enum для преобразования enum в int и int для перечисления
- Поскольку я использую Spring, есть ли способ сообщить JPA использовать определенный конвертер (RightEditor)?