दिलचस्प पोस्ट
क्या स्काला वेब-चौखटे उपलब्ध हैं? एचटीएमएल 5 कैनवास आकार (डाउनस्केल) छवि उच्च गुणवत्ता? जावास्क्रिप्ट सॉर्ट फ़ंक्शन पहले तो दूसरे द्वारा क्रमबद्ध करें कैसे सी + + 11 में make_unique समारोह को लागू करने के लिए? ओरेकल एसक्यूएल डेवलपर में सीएसवी के लिए क्वेरी परिणाम कैसे निर्यात करें? JSTL के साथ स्ट्रिंग का प्रतिनिधित्व यूआरएल पथ को कैसे एन्कोड करना है? कंस्ट्रक्टर आर्गेंस के साथ एक्शन फ़िल्टर की उपस्थिति के लिए मैं कैसे परीक्षण कर सकता हूं? क्या मैं shared_ptr या unique_ptr का उपयोग करना चाहिए रिश्ते को बदला नहीं जा सका क्योंकि एक या अधिक विदेशी-प्रमुख गुण अबाधित हैं सरल लिनक्स सिग्नल हैंडलिंग त्रुटि: '..' में सदस्य '..' के लिए अनुरोध जो कि गैर-वर्ग प्रकार का है ToString () PHP में बराबर है फेसबुक ओपन ग्राफ़ नहीं समाशोधन कैश jQuery – प्रत्येक 10 सेकंड में एजेक्स को कॉल करें विंडोज़ के अजगर 2.7 पर सुंदर सूप 4 कैसे स्थापित करें

0/1 के बजाय वाई / एन टाइप बूलियन के लिए हाइबरनेट (जेपीए का उपयोग करके) कॉन्फ़िगर करें

क्या मैं Y/N रूप में Boolean प्रकारों को जारी रखने के लिए जेपीए / हाइबरनेट सेटअप कर सकता हूं? डेटाबेस में (स्तंभ varchar2(1) रूप में परिभाषित किया गया है। यह वर्तमान में उन्हें 0/1 रूप में संग्रहीत करता है। डेटाबेस ओरेकल है

Solutions Collecting From Web of "0/1 के बजाय वाई / एन टाइप बूलियन के लिए हाइबरनेट (जेपीए का उपयोग करके) कॉन्फ़िगर करें"

मुझे यह पता चल गया है कि यह कैसे करना है मेरी कक्षा के लिए दो गुण हैं I प्रोग्रामिंग एपीआई के लिए बूलीयन के रूप में, जो मैपिंग में शामिल नहीं है। यह एक निजी चर परिवर्तनीय है जो Y / N है और इसे प्राप्तकर्ता और सेटटर संदर्भ है फिर मेरे पास एक और संरक्षित संपत्ति है जो हाइबरनेट मैपिंग में शामिल है और इसे गेटर्स और सेटर्स निजी वर्ण चर सीधे संदर्भित करते हैं

सीतनिद्रा में होना एक अंतर्निहित "yes_no" प्रकार है जो कि आप क्या करना चाहते हैं। डेटाबेस में एक चार्ट (1) कॉलम के लिए यह मानचित्र

मूल मानचित्रण: <property name="some_flag" type="yes_no"/>

टिप्पणी मैपिंग (हाइबरनेट एक्सटेंशन):

 @Type(type="yes_no") public boolean getFlag(); 

यह शुद्ध जेपीए बिना गेटर्स / सेटर्स का उपयोग कर रहा है। 2013-2014 तक यह हाइबरनेट विशिष्ट एनोटेशन का उपयोग किए बिना सबसे अच्छा जवाब है, लेकिन कृपया ध्यान दें कि यह समाधान जेपीए 2.1 है, और जब सवाल पहले पूछा गया था तब उपलब्ध नहीं था:

 @Entity public class Person { @Convert(converter=BooleanToStringConverter.class) private Boolean isAlive; ... } 

और तब:

 @Converter public class BooleanToStringConverter implements AttributeConverter<Boolean, String> { @Override public String convertToDatabaseColumn(Boolean value) { return (value != null && value) ? "Y" : "N"; } @Override public Boolean convertToEntityAttribute(String value) { return "Y".equals(value); } } 

संपादित करें:

इसके बाद के क्रियान्वयन में "वाई" से भिन्न कुछ भी नहीं है, जिसमें null भी शामिल है, जो कि false । क्या वो सही है? कुछ लोग यहां इस गलत बात को मानते हैं, और मानते हैं कि डेटाबेस में null जावा में null होना चाहिए।

लेकिन अगर आप जावा में null लौटते हैं, तो यह आपको एक NullPointerException देगा, यदि आपका फ़ील्ड एक प्राचीन बूलीयन है । दूसरे शब्दों में, जब तक कि आपके कुछ खेतों में वास्तव में वर्ग बूलियन का उपयोग नहीं किया जाता है, तो यह false रूप में null पर विचार करने के लिए सबसे अच्छा है, और उपरोक्त क्रियान्वयन का उपयोग करें तब सीतनिद्रा में होना डेटाबेस की सामग्री की परवाह किए बिना किसी भी अपवाद का उत्सर्जन नहीं करना होगा।

और यदि आप null स्वीकार करना चाहते हैं और अपवादों को छोड़ना चाहते हैं यदि डेटाबेस की सामग्री सख्ती से सही नहीं है, तो मुझे लगता है कि आपको "वाई", "एन" और null अलावा किसी भी वर्ण को स्वीकार नहीं करना चाहिए। इसे सुसंगत बनाएं, और "y", "n", "0" और "1" जैसे किसी भी बदलाव को स्वीकार न करें, जो केवल बाद में आपके जीवन को कठिन बना देगा। यह एक और सख्त कार्यान्वयन है:

 @Override public String convertToDatabaseColumn(Boolean value) { if (value == null) return null; else return value ? "Y" : "N"; } @Override public Boolean convertToEntityAttribute(String value) { if (value == null) return null; else if (value.equals("Y")) return true; else if (value.equals("N")) return false; else throw new IllegalStateException("Invalid boolean character: " + value); } 

और फिर एक और विकल्प, यदि आप जावा में null अनुमति देना चाहते हैं लेकिन डेटाबेस में नहीं:

 @Override public String convertToDatabaseColumn(Boolean value) { if (value == null) return "-"; else return value ? "Y" : "N"; } @Override public Boolean convertToEntityAttribute(String value) { if (value.equals("-") return null; else if (value.equals("Y")) return true; else if (value.equals("N")) return false; else throw new IllegalStateException("Invalid boolean character: " + value); } 

मैंने @ Marcg द्वारा पोस्ट किए गए उत्तर से अवधारणा का इस्तेमाल किया और यह जेपीए 2.1 के साथ बहुत अच्छा काम करता है। उनका कोड बिल्कुल सही नहीं था, इसलिए मैं अपना कामकाज कार्यान्वयन पोस्ट कर रहा हूं। यह Boolean इकाई फ़ील्ड को डेटाबेस में वाई / एन वर्ण कॉलम में बदल देगा।

मेरी इकाई वर्ग से:

 @Convert(converter=BooleanToYNStringConverter.class) @Column(name="LOADED", length=1) private Boolean isLoadedSuccessfully; 

मेरा कनवर्टर वर्ग:

 /** * Converts a Boolean entity attribute to a single-character * Y/N string that will be stored in the database, and vice-versa * * @author jtough */ public class BooleanToYNStringConverter implements AttributeConverter<Boolean, String> { /** * This implementation will return "Y" if the parameter is Boolean.TRUE, * otherwise it will return "N" when the parameter is Boolean.FALSE. * A null input value will yield a null return value. * @param b Boolean */ @Override public String convertToDatabaseColumn(Boolean b) { if (b == null) { return null; } if (b.booleanValue()) { return "Y"; } return "N"; } /** * This implementation will return Boolean.TRUE if the string * is "Y" or "y", otherwise it will ignore the value and return * Boolean.FALSE (it does not actually look for "N") for any * other non-null string. A null input value will yield a null * return value. * @param s String */ @Override public Boolean convertToEntityAttribute(String s) { if (s == null) { return null; } if (s.equals("Y") || s.equals("y")) { return Boolean.TRUE; } return Boolean.FALSE; } } 

यह संस्करण मज़ेदार है अगर आपको इमोटिकॉन पसंद है और आपके डेटाबेस में वाई / एन या टी / एफ के सिर्फ बीमार और थक गए हैं इस स्थिति में, आपके डेटाबेस कॉलम को एक के बजाय दो वर्ण होने चाहिए। शायद एक बड़ा सौदा नहीं है

 /** * Converts a Boolean entity attribute to a happy face or sad face * that will be stored in the database, and vice-versa * * @author jtough */ public class BooleanToHappySadConverter implements AttributeConverter<Boolean, String> { public static final String HAPPY = ":)"; public static final String SAD = ":("; /** * This implementation will return ":)" if the parameter is Boolean.TRUE, * otherwise it will return ":(" when the parameter is Boolean.FALSE. * A null input value will yield a null return value. * @param b Boolean * @return String or null */ @Override public String convertToDatabaseColumn(Boolean b) { if (b == null) { return null; } if (b) { return HAPPY; } return SAD; } /** * This implementation will return Boolean.TRUE if the string * is ":)", otherwise it will ignore the value and return * Boolean.FALSE (it does not actually look for ":(") for any * other non-null string. A null input value will yield a null * return value. * @param s String * @return Boolean or null */ @Override public Boolean convertToEntityAttribute(String s) { if (s == null) { return null; } if (HAPPY.equals(s)) { return Boolean.TRUE; } return Boolean.FALSE; } } 

Y / N के लिए बेहतर बूलियन मानचित्रण करने के लिए, अपने हाइबरनेट कॉन्फ़िगरेशन में जोड़ें:

 <!-- when using type="yes_no" for booleans, the line below allow booleans in HQL expressions: --> <property name="hibernate.query.substitutions">true 'Y', false 'N'</property> 

अब आप HQL में booleans का उपयोग कर सकते हैं, उदाहरण के लिए:

 "FROM " + SomeDomainClass.class.getName() + " somedomainclass " + "WHERE somedomainclass.someboolean = false" 

इसे एक जेनेरिक जेपीए मार्ग में मिलकर लिखने वाले एनोटेशन का उपयोग करने के लिए, नीचे दिए गए उदाहरण हाइबरनेट 3.5.4 और ओरेकल 11 जी के लिए मेरे लिए काम करता है। ध्यान दें कि मैप किए गए और सेटर ( getOpenedYnString और setOpenedYnString ) निजी विधियां हैं वे विधियां मैपिंग प्रदान करती हैं लेकिन कक्षा तक सभी प्रोग्राममैटिक एक्सेस getOpenedYn और setOpenedYn विधियों का उपयोग कर रहा है।

 private String openedYn; @Transient public Boolean getOpenedYn() { return toBoolean(openedYn); } public void setOpenedYn(Boolean openedYn) { setOpenedYnString(toYesNo(openedYn)); } @Column(name = "OPENED_YN", length = 1) private String getOpenedYnString() { return openedYn; } private void setOpenedYnString(String openedYn) { this.openedYn = openedYn; } 

toYesNo और toBoolean स्थिर विधियों के साथ यहां toBoolean :

 public class JpaUtil { private static final String NO = "N"; private static final String YES = "Y"; public static String toYesNo(Boolean value) { if (value == null) return null; else if (value) return YES; else return NO; } public static Boolean toBoolean(String yesNo) { if (yesNo == null) return null; else if (YES.equals(yesNo)) return true; else if (NO.equals(yesNo)) return false; else throw new RuntimeException("unexpected yes/no value:" + yesNo); } } 

जेपीए 2.1 कन्वर्टर्स का उपयोग करना सबसे अच्छा समाधान है, यद्यपि आप जेपीए के पहले संस्करण का उपयोग कर रहे हैं, तो मैं एक और समाधान (या वर्कअराउंड) की सिफारिश कर सकता हूं। बुलियन रैपर नामक एक एन्यूम को टी और एफ के 2 मानों के साथ बनाएँ और लिपटे गए मूल्य प्राप्त करने के लिए निम्नलिखित विधि जोड़ें: public Boolean getValue() { return this == T; } public Boolean getValue() { return this == T; } , इसे @Enumerated (EnumType.STRING) के साथ मैप करें।