Tôi đang tìm kiếm những cách khác nhau để lập bản đồ enum bằng JPA. Tôi đặc biệt muốn đặt giá trị số nguyên của từng mục enum và chỉ lưu giá trị số nguyên.
@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;
}
Một giải pháp đơn giản là sử dụng chú thích liệt kê với EnumType.ORDINAL:
@Column(name = "RIGHT")
@Enumerated(EnumType.ORDINAL)
private Right right;
Nhưng trong trường hợp này, JPA ánh xạ chỉ số enum (0,1,2) chứ không phải giá trị tôi muốn (100,200,300).
Hai giải pháp tôi thấy không đơn giản ...
Giải pháp đầu tiên
Một giải pháp, được đề xuất ở đây , sử dụng @PrePersist và @PostLoad để chuyển đổi enum sang một trường khác và đánh dấu trường enum là tạm thời:
@Basic
private int intValueForAnEnum;
@PrePersist
void populateDBFields() {
intValueForAnEnum = right.getValue();
}
@PostLoad
void populateTransientFields() {
right = Right.valueOf(intValueForAnEnum);
}
Giải pháp thứ hai
Giải pháp thứ hai được đề xuất ở đây đã đề xuất một đối tượng chuyển đổi chung, nhưng vẫn có vẻ nặng và hướng theo chế độ ngủ đông (@Type dường như không tồn tại trong 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")
}
)
Có giải pháp nào khác không?
Tôi có một vài ý tưởng trong đầu nhưng tôi không biết liệu chúng có tồn tại trong JPA không:
- sử dụng các phương thức setter và getter của thành viên bên phải của lớp Author khi tải và lưu đối tượng Author
- một ý tưởng tương đương sẽ là nói với JPA các phương thức của Right enum để chuyển đổi enum thành int và int thành enum
- Bởi vì tôi đang sử dụng Spring, có cách nào để nói với JPA sử dụng một trình chuyển đổi cụ thể (RightEditor) không?