ฉันกำลังมองหาวิธีต่างๆในการแมป enum โดยใช้ 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 จะแมปดัชนี enum (0,1,2) และไม่ใช่ค่าที่ฉันต้องการ (100,200,300)
โซลูชันที่สองที่ฉันพบดูเหมือนจะไม่ง่าย ...
ทางออกแรก
โซลูชันที่เสนอที่นี่ใช้ @PrePersist และ @PostLoad เพื่อแปลง enum เป็นฟิลด์อื่นและทำเครื่องหมายฟิลด์ enum เป็น transient:
@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 Class เมื่อทำการโหลดและบันทึกออบเจกต์ Authority
- ความคิดที่เท่าเทียมกันจะบอก JPA ว่าอะไรคือวิธีการ Right enum ในการแปลง enum เป็น int และ int เป็น enum
- เพราะฉันใช้สปริงมีวิธีบอก JPA ให้ใช้ตัวแปลงเฉพาะ (RightEditor) หรือไม่