2009-10-14 12 views
8

मुझे पता है कि यह ठीक करने के लिए एक बहुत ही प्राथमिक मुद्दा होना चाहिए, लेकिन 1) मैं हाइबरनेट के लिए अपेक्षाकृत नया हूं, और 2) जो फिक्सेस मैंने पाया है (ऐसा प्रतीत होता है) यहां लागू नहीं होता है ।हाइबरनेट: अनमैड क्लास एसोसिएशन अपवाद

org.hibernate.MappingException: An association from the table POSTS refers to 
an unmapped class: com.beans.User at 
org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1285)

यह तब होता है जब हाइबरनेट ही कॉन्फ़िगर करने के लिए प्रयास करता है:

यहाँ अपवाद मैं हो रही है।

जिन वस्तुओं के साथ मैं काम कर रहा हूं वे उपयोगकर्ता हैं, पोस्ट (सार सुपरक्लास), स्थिति और टिप्पणियां (पोस्ट के ठोस उप-वर्ग)। प्रत्येक दो टेबलों में से एक से बीन है: USERS और POSTS। उपयोगकर्ता ऑब्जेक्ट्स सुंदर वेनिला हैं: उपयोगकर्ता का वर्णन करने वाले बहुत सारे ब्लेंड फ़ील्ड। समान उबाऊ क्षेत्रों के अलावा, एक स्थिति और एक टिप्पणी दोनों मालिक हैं (उपयोगकर्ता इसे पोस्ट किया गया है)। किसी टिप्पणी से स्थिति में क्या अंतर होता है यह है कि स्थिति में उससे जुड़ी टिप्पणियों की एक सूची हो सकती है लेकिन कोई अभिभावक नहीं है, जबकि किसी टिप्पणी में कोई बच्चा पोस्ट नहीं होता है, लेकिन माता-पिता (हाँ, यह मूल रूप से फेसबुक है)।

जो मैंने पढ़ा है, उससे समस्या कई से एक मैपिंग में प्रतीत होती है, लेकिन मुझे कुछ भी गलत नहीं लगता है। यहां तीन विन्यास फाइलें हैं जिनका मैं उपयोग कर रहा हूं।

hibernate.cfg.xml:

 
<hibernate-configuration> 
    <session-factory> 
     ... 
     <!-- mapped persistence classes --> 
     <mapping resource="User.hbm.xml" /> 
     <mapping resource="Post.hbm.xml" /> 
    </session-factory> 
</hibernate-configuration>

User.hbm.xml:

 
<hibernate-mapping> 
    <class name="com.beans.User" entity-name="User" table="USERS" proxy="User"> 
     <id name="uid" type="java.lang.Integer"> 
      <column name="uid" /> 
      <generator class="assigned" /> 
     </id> 
     ... 
    </class> 
</hibernate-mapping>

Post.hbm.xml:

<hibernate-mapping> 
    <class name="com.beans.Post" entity-name="Post" table="POSTS" proxy="Post" abstract="true"> 
     <id name="pid" type="java.lang.Integer"> 
      <column name="pid" /> 
      <generator class="assigned" /> 
     </id>    
     <discriminator column="type" /> 
     <one-to-one name="parent" class="com.beans.Post"></one-to-one> 
     <many-to-one name="owner" class="com.beans.User" update="false" fetch="select"> 
      <column name="owner" /> 
     </many-to-one> 
     <property name="postDate" type="java.sql.Timestamp" update="false"> 
      <column name="post_date" /> 
     </property> 
     <property name="content" type="java.lang.String" update="false"> 
     <column name="content" /> 
     </property> 
     <property name="type" type="string" update="false"> 
     <column name="type" /> 
     </property> 

     <subclass name="com.beans.Status" discriminator-value="status"> 
     <list name="children" inverse="false" table="POSTS" lazy="true"> 
       <key column="pid" /> 
      <index /> 
      <one-to-many class="com.beans.Comment" /> 
    </list> 
     </subclass> 

     <subclass name="com.beans.Comment" discriminator-value="comment"></subclass> 
    </class> 
</hibernate-mapping> 

मैं महसूस कर रही मैं करने की जरूरत है पाने के कहीं भी इस तथ्य को निर्दिष्ट करें कि किसी स्थिति में टिप्पणी का ऐरेलिस्ट होता है, लेकिन यह पोस्ट.hbm.xml f में "सूची" निर्माण के माध्यम से पूर्ण रूप से नहीं किया जाता है इले?

एक्सएमएल फाइलें मेरे क्लासपाथ (वेब-आईएनएफ/कक्षाओं) में मौजूद हैं, और .java फाइलें भी एप्लिकेशन के लिए दृश्यमान हैं। अंतर्दृष्टि की सराहना की जाएगी!

उत्तर

17

आपके द्वारा पोस्ट किया गया अपवाद आपको <class> घोषणा पर स्पष्ट रूप से इकाई नाम निर्दिष्ट करने और <many-to-one> पर निर्दिष्ट नहीं करने के कारण होता है। इकाई का नाम special attribute एक ही कक्षा के आधार पर विभिन्न मैपिंग के बीच अंतर करने के लिए उपयोग किया जाता है। आपको मैपिंग के लिए इसकी आवश्यकता नहीं है। माता-पिता के लिए

  1. <one-to-one> मानचित्रण गलत है:

    कहा, आपकी मानचित्रण के साथ कई अन्य समस्याएं हैं। यह परिभाषा के अनुसार एक-एक नहीं हो सकता है - जबकि यह पोस्ट में केवल एक माता-पिता होगा, एक और पोस्ट में वही माता-पिता हो सकता है (विशेष रूप से टिप्पणियों के लिए) जो माता-पिता को एक-दूसरे के सहयोग का अंत बनाता है। इसके बजाय आपको इसे <many-to-one> के रूप में मैप करने की आवश्यकता है।

  2. टिप्पणियों की सूची वास्तव में एक सूची नहीं है जब तक कि आपके पास इंडेक्स को बनाए रखने के लिए एक विशेष कॉलम न हो (जिसे आप खाली नहीं कर रहे हैं - और अमान्य - <index/> घोषणा)। इसके बजाय इसे <bag> के रूप में मानचित्र करें।
  3. टिप्पणी सूची वास्तव में उलटा = सत्य के साथ मैप किया जाना चाहिए।
  4. प्रति समस्या नहीं है लेकिन यह आपके मैपिंग को पढ़ने में कठोर बनाता है - नेस्टेड <column> तत्व की आवश्यकता नहीं है; यदि आप कॉलम नाम संपत्ति नाम से मेल खाते हैं तो आप इसके बजाय विशेषता के रूप में इसे प्राप्त कर सकते हैं या इसे पूरी तरह से छोड़ सकते हैं।इसी तरह, अद्यतन = झूठी हर जगह में कोई बिंदु नहीं - यदि आप अपनी पोस्ट अपडेट नहीं करना चाहते हैं, तो उन्हें सहेजें :-)
+2

वाह, बहुत बहुत धन्यवाद! यह स्पष्ट है कि मेरे पास अभी भी आपके ढांचे के बारे में जानने के लिए काफी कुछ है, क्योंकि मैंने आपके सुझावों का पालन करने के बाद, मुझे अपने हाइबरनेट कॉन्फ़िगरेशन के अन्य पहलुओं को गड़बड़ाने से कम से कम एक दर्जन नए अपवादों को अनुक्रमित करना पड़ा। इस बार मेरी गलतियों को और अधिक सरल था, और सबकुछ काम कर रहा है :) यह मेरा पहला कभी-कभी हाइबरनेट संचालित एप्लिकेशन है, और सीखने के केवल तीन दिनों के बाद यह सांस ले रहा है! मदद के लिए आपका बहुत बहुत धन्यवाद! – Magsol

+3

आपका स्वागत है और हाइबरनेट के साथ शुभकामनाएँ। यह पहली बार थोड़ा मुश्किल आता है लेकिन थोड़ी देर बाद दूसरी प्रकृति बन जाता है। और वह तथ्य यह है कि आप इसे केवल 3 दिनों के बाद काम करने में कामयाब रहे हैं, सुझाव देते हैं कि आपको आगे बढ़ने में बहुत सारी समस्याएं नहीं होंगी :-) – ChssPly76

2

मेरे लिए यह समस्या मैपिंग के बजाय किसी संपत्ति का संदर्भ देने का प्रयास कर रही थी यह।

धाराप्रवाह वाक्यविन्यास में मैं यह कर रहा था (गलत!)।

mapping.References(x => x.AdvertExpiryDays).Not.Nullable(); 

इसके बजाय (सही!)।

mapping.Map(x => x.AdvertExpiryDays).Not.Nullable(); 

जहां AdvertExpiryDays एक इकाई नहीं था।

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