2012-11-10 12 views
6

के लिए मैपिंग में दोहराया गया कॉलम मैं हाइबरनेट 3.2.5 का उपयोग कर रहा हूं। मुझे कई से एक मैपिंग का उपयोग करते समय उपरोक्त अपवाद मिल रहा है। प्रशिक्षण तालिका में विभाग तालिका के साथ एक से अधिक संबंध हैं, यानी एक जमा एक से अधिक प्रशिक्षण लेने में सक्षम है।org.hibernate.MappingException: इकाई

अपवाद मुझे मेरी एचबीएम फ़ाइल में insert="false" update="false" जोड़ने के लिए कह रहा है। अगर मैं एचबीएम फ़ाइल में यह बिट जोड़ता हूं, तो कोड ठीक काम करता है।

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping> 

    <class name="com.infy.model.Training" table="training"> 
    <id name="Id" type="integer" column="ID"> 
     <generator class="assigned"></generator> 
    </id>  
    <property name="trainerName"> 
     <column name="TRAINER_NAME"></column> 
    </property> 
    <property name="deptId"> 
     <column name="DEPT_ID"></column> 
    </property> 
    <property name="trainingSubject"> 
     <column name="TRAINING_SUBJECT"></column> 
    </property> 
    <many-to-one name="departmentDetails" column="DEPT_ID"></many-to-one> 
    </class> 
</hibernate-mapping> 

अगर मैं इस लाइन को बदलने के लिए::

<many-to-one name="departmentDetails" column="DEPT_ID" insert="false" update="false"></many-to-one> 

तो कोड काम करता है

यहाँ HBM फ़ाइल है। मैं जानना चाहता हूं कि इसे जोड़ने का सही कारण क्या है।

सादर,

उत्तर

7

आप दो बार DEPT_ID स्तंभ मैप किया गया है, यहाँ:

<property name="deptId"> 
     <column name="DEPT_ID"></column> 
    </property> 

और यहाँ:

<many-to-one name="departmentDetails" column="DEPT_ID"></many-to-one> 

जब एक का चयन करें बयान को क्रियान्वित करने, हाइबरनेट ठीक ही से अपने वस्तु के दो गुण पॉप्युलेट हो जाएगा कॉलम, हालांकि एक डालने या अद्यतन करने पर यह तय नहीं कर सकता कि डेटाबेस में कौन सी संपत्ति जारी रहती है।

आपको पहले स्थान पर उसी कॉलम में मैप किए गए दो गुणों की आवश्यकता क्यों है? आप deptId के लिए उपयोग की जरूरत है, तो आप शायद deptId संपत्ति को हटा सकते हैं और आप अपने मैपिंग फ़ाइल में दो बार एक ही स्तंभ नाम का उपयोग कर रहे हैं, तो बजाय

training.getDepartmentDetails().getId() 
5

इस परिदृश्य के लिए त्रुटि संदेश काफी स्पष्ट है (आप इसे यहाँ डाल दिया है नहीं, लेकिन मैं इसे कई बार देखा है)। समस्या यह है कि आपने अपनी कक्षा में दो अलग-अलग क्षेत्रों में कॉलम DEPT_ID को मैप किया है।

सबसे पहले, आपने इसे deptId और फिर departmentDetails पर मैप किया है। जैसा कि आप पाते हैं, हाइबरनेट इसे केवल तभी करने की अनुमति देता है जब मैपिंग में से एक को insert="false" update="false" माना जाता है।

कारण काफी सरल है। यदि आप deptId को किसी अन्य आईडी में बदल देंगे, तो हाइबरनेट को departmentDetails में मैप किए गए वर्ग को बदलने की आवश्यकता होगी, जो काफी जटिल है।

यदि आपको deptId प्राप्त करने की आवश्यकता है, तो आप Training पर getDeptId विधि जोड़ सकते हैं जो departmentDetails.getId() देता है। और setDeptId प्रदान न करें।

1

है। हो सकता है कि आप मैपिंग अपवाद

Initial SessionFactory creation failed.org.hibernate.MappingException: 

यदि आप insert = flase और update = false चिह्नित करते हैं।

यदि आप टेबल या किसी अन्य विरासत प्रणाली में रिकॉर्ड्स में अपडेट या डालने का प्रयास करते हैं तो इन कॉलम मान को अपडेट करने का प्रयास करें। यह दायर या अद्यतन नहीं होगा।

कृपया नीचे दिए गए लिंक की जांच करें। यह आपके समाधान खोजने में मदद करेगा।

http://www.techienjoy.com/hibernate-insert-update-control.php

धन्यवाद संदीप जी