سؤال

أعلم أن هذا يجب أن يكون مشكلة أولية لإصلاحه ، لكن 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)

يحدث هذا عندما يحاول السبات لتكوين نفسه.

الكائنات التي أعمل معها هي المستخدمين ، والمشاركات (الفئة الخارقة المجردة) ، والحالات والتعليقات (الفئات الفرعية الملموسة للنشر). كل فول من أحد الجدولين: المستخدمين والمنشورات. كائنات المستخدم جميلة الفانيليا: الكثير من الحقول اللطيفة التي تصف المستخدم. بالإضافة إلى الحقول المملة بالمثل ، فإن الحالة والتعليق على حد سواء أصحابها (المستخدم الذي نشره). ما الذي يميز الحالة عن التعليق هو أن الحالة يمكن أن تحتوي على قائمة بالتعليقات المرتبطة به ولكن لا يوجد أحد الوالدين ، في حين أن التعليق لا يوجد لديه منشورات للأطفال ، ولكن لديه أحد الوالدين (نعم ، هذا هو في الأساس Facebook).

من ما قرأته ، يبدو أن المشكلة في التعيينات العديدة إلى واحد ، لكن لا يمكنني العثور على أي شيء خاطئ. فيما يلي ملفات التكوين الثلاثة التي أستخدمها.

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>

أشعر أنني بحاجة إلى تحديد مكان ما حقيقة أن الحالة تحتوي على قائمة من التعليقات ، لكن ألم يتم ذلك ضمنيًا من خلال بنية "القائمة" في ملف post.hbm.xml؟

توجد ملفات XML في ClassPath (فئات الويب/الفئات) ، وملفات .java نفسها مرئية للتطبيق أيضًا. سيكون موضع تقدير الرؤى!

هل كانت مفيدة؟

المحلول

الاستثناء الذي نشرته ناتجًا عن تحديد اسم كيان بشكل صريح <class> الإعلان وعدم تحديده <many-to-one>. اسم الكيان هو السمة الخاصة تستخدم للتمييز بين التعيينات المختلفة بناءً على نفس الفئة. أنت لا تحتاجه لك رسم الخرائط.

ومع ذلك ، هناك العديد من المشكلات الإضافية في رسم الخرائط الخاص بك:

  1. <one-to-one> رسم الخرائط للوالدين خاطئ. لا يمكن أن يكون فرديًا بحكم التعريف-بينما هذه لن يكون لدى Post الوالدين سوى أحد الوالدين ، وقد يكون لدى منشور آخر نفس الوالد (خاصة بالنسبة للتعليقات) مما يجعل نهاية الوالدين من أحد أعوادها. تحتاج إلى تعيينه كـ <many-to-one> في حين أن.
  2. قائمة التعليقات ليست حقًا قائمة ما لم يكن لديك عمود خاص للحفاظ على فهرسه (الذي لا تحكم عليه بفارغ الفراغ - وغير صالح - <index/> تصريح). قم بتخطيطها <bag> في حين أن.
  3. يجب تعيين قائمة التعليقات حقًا مع عكس = صحيح.
  4. ليست مشكلة في حد ذاتها ولكنها تجعل من الصعب قراءة رسم الخرائط الخاص بك - ليست هناك حاجة للتداخل <column> عنصر؛ يمكنك الحصول عليها سمة بدلاً من ذلك أو تخطيها تمامًا إذا كان اسم العمود يتطابق مع اسم الخاصية. وبالمثل ، لا جدوى من التحديث = خطأ في كل مكان - إذا كنت لا تريد تحديث مشاركاتك ، فلا تحفظها :-)

نصائح أخرى

بالنسبة لي ، كانت هذه القضية ناتجة عن محاولة الرجوع إلى عقار بدلاً من رسمها.

في بناء الجملة بطلاقة كنت أفعل هذا (خطأ!).

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

بدلا من هذا (صحيح!).

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

حيث كان advertexpirydays int ليس كيانًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top