2009-10-14 112 views
8

我知道這應該是一個非常基本的問題來解決,但1)我相對較新的Hibernate,和2)我找到的修復程序不(似乎)適用於此處。Hibernate:未映射的類關聯異常

這是我收到的例外:

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)

當Hibernate試圖配置本身發生這種情況。

我正在使用的對象是用戶,帖子(抽象超類),狀態和註釋(Post的具體子類)。每個bean都來自兩個表中的一個:USERS和POSTS。用戶對象很漂亮:很多描述用戶的平淡的字段。除了類似無聊的字段外,狀態和評論都擁有所有者(發佈它的用戶)。從什麼評論區分一個狀態是一個狀態可以附加,但沒有父親的評論列表,而評論沒有孩子的職位,但有一個父(是的,這基本上是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> 

我得到我需要的感覺在某處指定Status包含Comment的ArrayList的事實,但不是通過Post.hbm.xml中的「list」構造隱式完成的f ILE?

xml文件存在於我的類路徑(WEB-INF/classes)中,並且.java文件本身對應用程序也是可見的。洞察將不勝感激!

回答

17

你張貼的異常是由你<class>聲明中明確指定的實體名稱,而不是指定它<many-to-one>引起的。實體名稱是special attribute,用於根據相同的類別區分不同的映射。你不需要它爲你繪製。

這就是說,有與你的映射多個其他問題:

  1. <one-to-one>映射父是錯誤的。它不可能是一個對一個定義 - 而這只會有一個家長,另一篇文章可能有相同的父(特別是徵求意見),這使得關聯的一個一對多的父母的結束。您需要將其映射爲<many-to-one>
  2. 評論列表並不是一個真正的列表,除非您有一個專門的列來維護其索引(您不會通過空值來判斷 - 無效 - <index/>聲明)。改爲將其映射爲<bag>
  3. 評論列表真的應該與逆映射=真。
  4. 本身並不是一個問題,但它使得你的映射更難閱讀 - 不需要嵌套的<column>元素;您可以將其作爲屬性來替代,或者在列名稱與屬性名稱匹配的情況下將其完全跳過。同樣,沒有任何地方更新=虛假的地方 - 如果你不想你的帖子更新,不要保存:-)
+2

哇,非常感謝!很明顯,我仍然有很多東西需要了解這個框架,因爲在我遵循你的建議之後,我不得不依次處理至少一些新的異常,從而搞亂了我的Hibernate配置的其他方面。這次我的錯誤更直接,一切似乎都在正常工作:) 這是我第一次使用Hibernate驅動的應用程序,只需三天的學習就可以呼吸!非常感謝您的幫助! – Magsol 2009-10-14 16:10:31

+3

歡迎您和Hibernate一起好運。起初有點困難,但在一段時間後成爲第二性質。而事實證明,只有3天才能成功運行,這表明你不會遇到太多問題:-) – ChssPly76 2009-10-14 16:37:14

2

對我來說,這個問題是由試圖引用屬性而不是映射它。

流利的語法我是這樣做的(錯誤!)。

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

而不是這個(正確!)。

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

Where AdvertExpiryDays是一個int不是實體。