मैं 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.ORDINAL के साथ एन्यूमरेटेड एनोटेशन का उपयोग करना है:
@Column(name = "RIGHT")
@Enumerated(EnumType.ORDINAL)
private Right right;
लेकिन इस मामले में जेपीए एनुम इंडेक्स (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(
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 में मौजूद हैं:
- प्राधिकरण ऑब्जेक्ट को लोड और सहेजते समय प्राधिकारी वर्ग के सेटर और गेट्टर विधियों का उपयोग करें
- समतुल्य विचार जेपीए को यह बताने के लिए होगा कि एनम को अंतर में और एनम को एनुम में बदलने के लिए राइट इनम के तरीके क्या हैं
- क्योंकि मैं स्प्रिंग का उपयोग कर रहा हूं, क्या जेपीए को एक विशिष्ट कनवर्टर (राइटएडिटर) का उपयोग करने का कोई तरीका है?