我正在寻找使用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;
}
一个简单的解决方案是将枚举注释与EnumType一起使用.依次的:
@Column(name = "RIGHT")
@Enumerated(EnumType.ORDINAL)
private Right right;
但是在本例中,JPA映射枚举索引(0,1,2),而不是我想要的值(100,200,300).
我发现的这两个解决方案看起来并不简单.
第一个解决方案
解决方案proposed here使用@PrePersist和@PostLoad将枚举转换为其他字段,并将枚举字段标记为瞬态:
@Basic
private int intValueForAnEnum;
@PrePersist
void populateDBFields() {
intValueForAnEnum = right.getValue();
}
@PostLoad
void populateTransientFields() {
right = Right.valueOf(intValueForAnEnum);
}
第二种解决方案
第二个解决方案proposed here提出了一个通用的转换对象,但是看起来仍然是沉重的、面向Hibernate的(@Type似乎不存在于JavaEE中):
@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")
}
)
还有其他解决方案吗?
我脑海中有几个 idea ,但我不知道它们是否存在于JPA中:
- 加载和保存Authority对象时,使用Authority类的right成员的setter和getter方法
- 一个等效的 idea 是告诉JPA什么是正确的enum方法来将enum转换为int和int转换为enum
- 因为我使用的是Spring,有没有办法告诉JPA使用特定的转换器(RightEditor)?