9

我知道这应该是一个需要解决的非常基本的问题,但是 1)我对 Hibernate 比较陌生,2)我发现的修复(似乎)不适用于这里。

这是我得到的例外:

org.hibernate.MappingException:来自表 POSTS 的关联引用
 一个未映射的类:com.beans.User at
 org.hibernate.cfg.Configuration.secondPassCompileForeignKeys(Configuration.java:1285)

当 Hibernate 尝试配置自身时会发生这种情况。

我正在使用的对象是用户、帖子(抽象超类)、状态和评论(帖子的具体子类)。每个都是来自两个表之一的 bean:USERS 和 POSTS。User 对象非常普通:许多描述用户的平淡无奇的字段。除了类似无聊的字段之外,状态和评论都有所有者(发布它的用户)。状态与评论的区别在于,状态可以附有评论列表但没有父级,而评论没有子帖子,但有父级(是的,这基本上是 Facebook)。

从我读过的内容来看,问题似乎出在多对一映射中,但我似乎找不到任何问题。这是我正在使用的三个配置文件。

休眠.cfg.xml:

<休眠配置>
    <会话工厂>
        ...
        <!-- 映射的持久性类 -->
        <映射资源="User.hbm.xml" />
        <映射资源="Post.hbm.xml" />
    </会话工厂>
</hibernate-configuration>

用户.hbm.xml:

<休眠映射>
    <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>

我觉得我需要在某处指定一个状态包含评论的 ArrayList 的事实,但这不是通过 Post.hbm.xml 文件中的“列表”结构隐式完成的吗?

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

4

2 回答 2

18

您发布的异常是由于您在<class>声明中明确指定实体名称而不是在<many-to-one>. 实体名称是一种特殊属性,用于区分基于同一类的不同映射。您不需要它来进行映射。

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

  1. <one-to-one>父母的映射是错误的。根据定义,它不能是一对一的——虽然这个帖子只有一个父级,但另一个帖子可能有同一个父级(尤其是评论),这使得父级的关联结束是一对多的。您需要将其映射为<many-to-one>
  2. 评论列表并不是真正的列表,除非您有一个特殊的列来维护其索引(您不能通过空 - 和无效 -<index/>声明来判断)。将其映射为<bag>
  3. 评论列表确实应该用 inverse=true 映射。
  4. Not a problem per se but it makes your mapping harder to read - there's no need for nested <column> element; you can have it as attribute instead or skip it altogether if column name matches property name. Similarly, no point in having update=false everywhere - if you don't want your posts updated, don't save them :-)
于 2009-10-14T05:40:17.997 回答
2

For me this issue was caused by trying to reference a property rather than mapping it.

In fluent syntax I was doing this (wrong!).

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

Rather than this (correct!).

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

Where AdvertExpiryDays was an int NOT an entity.

于 2012-07-20T13:02:51.650 回答