मैंने जेपीए और जेएक्सबी के आधार पर एक आरईएसटी एपीआई लागू की है।जेपीए लांग @ आईडी जेएक्सबी @ एक्सएमएलआईडी एक्सएसडी सत्यापन त्रुटि उत्पन्न करता है
मैं मोटे तौर पर यह (बहुत सरल) की तरह एक वर्ग:
@Entity
@XmlRootElement
...
public class Thing {
@Id
@GeneratedValue
...
@XmlAttribute
@XmlID
@XmlJavaTypeAdapter(JAXBLongAdapter.class)
private Long id;
...
}
हाइबरनेट (मेरे वर्तमान जेपीए प्रदाता) आईडी मूल्य के रूप में संख्या उत्पन्न करता है, लेकिन वे स्वाभाविक रूप से केवल एक ही एक प्रकार, बात में के लिए अद्वितीय हैं यह उदाहरण
अब एक्सएसडी का कहना है कि xsd: id (@XmlID) एक एनसीस्ट्रिंग है जो एक सादा संख्या नहीं हो सकता है इसलिए मैंने JAXBLongAdapter में संख्याओं के लिए '_' तैयार किया। - '_1'
की तरह अब स्कीमा सत्यापनकर्ता शिकायत:
[org.xml.sax.SAXParseException: cvc-id.2: There are multiple occurrences of ID value '_1'.]
अगर मैं सही ढंग एक XSD इस बात को समझ: आईडी तत्व एक (स्ट्रिंग) मूल्य कि XML दस्तावेज में वैश्विक रूप से अद्वितीय है होना आवश्यक है। लेकिन यह डेटाबेस में आईडी का उपयोग करने के सामान्य तरीके से बहुत विपरीत है।
अब मैं क्या करूँ? मैं तीन बातें के बारे में सोचा:
- एक प्रकार विशिष्ट उपसर्ग के साथ प्रत्येक प्रकार के लिए एक JAXBLongAdapter बनाएँ?
- अन्य जेपीए आईडी जनरेटर का उपयोग करना, शायद यूयूआईडी? - पर कौनसा?
- @XmlID और @XmlIDREF का उपयोग करना बंद करें, जो अनावश्यकता और सामान्य गड़बड़ी पैदा करता है।
ऐसा लगता है कि अब मुझे विभिन्न आईडी का उपयोग करने के लिए डेटाबेस स्कीमा को बदलना है। - लेकिन यह अच्छा होगा अगर आईडी कम रहे, क्योंकि वे यूआरएल में दिखाई देते हैं।
मेरा प्रश्न: क्या कोई आईडी जनरेटर है जो तुलनात्मक रूप से तेज़ है और वैश्विक स्तर पर अद्वितीय है? या इस से निपटने का कोई और तरीका है?
संपादित करें:
इस हैक थोड़े, काम करता है जेपीए आईडी बरकरार छोड़कर।
@XmlID
@XmlAttribute(name="id")
private String getXmlID(){
return String.format("%s-%s", this.getClass().getSimpleName(), this.getId().toString());
}
private void setXmlID(String xmlid){
String prefix = String.format("%s-", this.getClass().getSimpleName());
if(xmlid.startsWith(prefix)){
this.id = Long.parseLong(xmlid.substring(prefix.length()));
}else{
throw new IllegalArgumentException(xmlid+" does not look like "+prefix+"###");
}
}
फ़ील्ड से जेएक्सबी एनोटेशन को एक्सएमएलआईडी के लिए समर्पित निजी गेटर्स/सेटर्स में ले जाकर।
देखें http://stackoverflow.com/questions/9629948/jaxb-what-should-be-returned-from-beforemarshalmarshaller-method –