Hibernate:未映射的类关联异常

时间:2009-10-14 04:40:55

标签: hibernate exception hibernate-mapping mappingexception

我知道这应该是一个非常基本的问题需要修复,但是1)我对Hibernate相对较新,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)

当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”构造隐式完成的吗?

xml文件存在于我的类路径(WEB-INF / classes)中,并且.java文件本身对应用程序也是可见的。我们将不胜感激!...

2 个答案:

答案 0 :(得分:17)

您发布的例外原因是您在<class>声明中明确指定实体名称而未在<many-to-one>上指定实体名称。实体名称是special attribute,用于区分基于同一类的不同映射。你不需要它来映射。

也就是说,您的映射存在多个其他问题:

    父项的
  1. <one-to-one>映射是错误的。根据定义,它不能一对一 - 而帖子只有一个父级,另一个帖子可能有相同的父级(尤其是评论),这使父级的关联结束为1-to -许多。您需要将其映射为<many-to-one>
  2. 评论列表实际上并不是一个列表,除非你有一个特殊的列来维护它的索引(你没有用空的判断 - 和无效的<index/>声明)。请将其映射为<bag>
  3. 评论列表确实应该用inverse = true映射。
  4. 本身不是问题,但它使您的映射难以阅读 - 不需要嵌套的<column>元素;您可以将其作为属性,或者如果列名称与属性名称匹配则完全跳过它。同样,无处不在更新= false - 如果您不希望更新帖子,请不要保存: - )

答案 1 :(得分:2)

对我来说,这个问题是由尝试引用属性而不是映射它引起的。

用流利的语法我这样做(错误!)。

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

而不是这个(正确!)。

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

其中AdvertExpiryDays是int而非实体。