2010-05-06 15 views
15

मैं हाइबरनेट एचबीएम फ़ाइल में वैकल्पिक एक-से-एक मैपिंग कैसे बना सकता हूं? उदाहरण के लिए, मान लीजिए कि मेरे पास उपयोगकर्ता है और last_visited_page तालिका है। उपयोगकर्ता को अंतिम_विजिटेड पृष्ठ हो सकता है या नहीं हो सकता है।हाइबरनेट में वैकल्पिक एक-से-एक मैपिंग

उपयोगकर्ता वर्ग::

<one-to-one name="lastVisitedPage" class="LastVisitedPage" cascade="save-update"> 

LastVisitedPage कक्षा:

<one-to-one name="user" class="user" constrained="true" /> 

ऊपर के उदाहरण के लिए एक उपयोगकर्ता के निर्माण की अनुमति नहीं है यहाँ मेरे वर्तमान एक-से-एक HBM फ़ाइल में मानचित्रण है जिनके पास अंतिम बार देखा गया पृष्ठ नहीं है। एक ताजा बनाया गया उपयोगकर्ता अभी तक किसी भी पेज पर नहीं गया है। UserPrefs मैपिंग वैकल्पिक बनाने के लिए मैं hbm मैपिंग कैसे बदलूं?

उत्तर

12

मेरे ज्ञान के लिए, हाइबरनेट वैकल्पिक एक-से-एक का समर्थन नहीं करता है (HHH-2007 देखें) तो आपको इसके बजाय not-null="false" के साथ नकली many-to-one का उपयोग करना होगा।

0

एक उपयोगकर्ता अधिकतम एक बार last_visited पेज है, तो वहाँ दो मामलों हैं:

(क) कुछ दिए गए उपयोगकर्ता कोई last_visited पेज, जिस स्थिति में वहाँ last_visited_page में इस उपयोगकर्ता के लिए किसी भी टपल नहीं होगा है तालिका, (बी) कुछ दिए गए उपयोगकर्ता के पास वास्तव में एक अंतिम पृष्ठ है, इस मामले में last_visited_page तालिका में इस उपयोगकर्ता के लिए बिल्कुल एक टुपल होगा।

इससे यह स्पष्ट होना चाहिए कि उपयोगकर्ता आईडी आपकी पिछली विज़िट-पेज तालिका में एक उम्मीदवार कुंजी है।

और यह स्पष्ट करना चाहिए कि आपको उस कुंजी को डीबीएमएस को घोषित करना चाहिए।

4

मुझे एक समान समस्या थी, लेकिन एनोटेशन का उपयोग करना। गूगल मुझे यहाँ लाया है, तो किसी और को ही sitatuions में खुद को पाता है, यह मेरे लिए काम किया:

http://opensource.atlassian.com/projects/hibernate/browse/ANN-725

आप एनोटेशन का उपयोग कर रहे हैं, तो आप @NotFound उपयोग कर सकते हैं (कार्रवाई = NotFoundAction.IGNORE) एनोटेशन ताकि आपको अपवाद न मिले। बस सुनिश्चित करें कि आपका कोड नल के लिए जांचता है क्योंकि यह अब वहां नहीं हो सकता है ;-)

9

बस आजकल एक ही चीज़ करने की कोशिश कर रहे अधिकांश दिन खर्च करें, अंत में निम्नलिखित समाधान मिला (केवल मामले में यह उपयोगी हो सकता है अन्य लोगों के लिए)

@OneToOne 
@JoinColumn(name="ClassA_Id", referencedColumnName="ClassB_Id", nullable=true) 

आशा किसी को कुछ समय के

+2

को बचाने में मदद कर सकता है कि बस एक FYI करें - इस समाधान मुद्दों अगर आप Envers का उपयोग करें (यदि आपको यह त्रुटि मिल जाएगा है: https: //hibernate.onjira। com/ब्राउज़/HHH-3853)। हाइबरनेट 3.6.8 ने इस मुद्दे को वैकल्पिक @OneToOne मैपिंग के साथ ठीक कर दिया है। – Phyxx

संबंधित मुद्दे