Question

Je sais que cela devrait être une question assez élémentaire pour fixer, mais 1) Je suis relativement nouveau dans Hibernate, et 2) les corrections que j'ai trouvé ne (semble) appliquer ici.

Voici l'exception que je reçois:

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)

Cela se produit lorsque Hibernate tente de se configurer.

Les objets avec lesquels je travaille sont les utilisateurs, les messages (résumé superclasse), et Commentaires (Statuses sous-classes concrètes de post). Chacun d'eux est le haricot de l'une des deux tables: UTILISATEURS et POTEAUX. Les objets utilisateur sont assez vanille: beaucoup de champs fades décrivant l'utilisateur. En plus des champs de la même ennuyeux, un statut et un commentaire ont tous les deux propriétaires (l'utilisateur qui a posté). Ce qui différencie un état d'un commentaire est qu'un statut peut avoir une liste des commentaires attachés à elle, mais aucun parent, alors qu'un commentaire n'a pas de messages des enfants, mais a un parent (oui, cela est essentiellement Facebook).

D'après ce que j'ai lu, le problème semble être dans many-to-one correspondances, mais je ne peux pas sembler trouver quelque chose de mal. Voici les trois fichiers de configuration que je utilise.

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>

Je sens que je dois préciser quelque part le fait qu'un statut contient un ArrayList de Commentaire de, mais est-ce pas fait implicitement par la construction de « liste » dans le fichier Post.hbm.xml?

Les fichiers xml existent dans mon classpath (WEB-INF / classes), et .java fichiers eux-mêmes sont visibles à l'application aussi bien. Insights serait apprécié!

Était-ce utile?

La solution

L'exception que vous avez posté est causé par vous spécifiant explicitement un nom d'entité sur la déclaration de <class> et ne pas spécifier sur <many-to-one>. Nom de l'entité est une attribut spécial utilisé pour distinguer entre les différentes applications en fonction de la même classe. Vous ne devez pas vous mapping.

Cela dit, il y a plusieurs problèmes supplémentaires avec votre cartographie:

  1. cartographie <one-to-one> pour les parents est erroné. Il ne peut pas être un à un, par définition, - alors que cette après n'avoir un parent, un autre poste peut avoir le même parent (surtout pour les commentaires) qui rend la fin de parent d'association one-to -beaucoup. Vous devez mapper comme <many-to-one> à la place.
  2. Liste des commentaires n'est pas vraiment une liste, sauf si vous avez une colonne spéciale pour maintenir son indice (que vous ne en juger par vide - et invalide - déclaration <index/>). Carte comme <bag> au lieu .
  3. Liste des commentaires devrait vraiment être mis en correspondance avec inverse = true.
  4. Pas un problème en soi, mais il rend votre application plus difficile à lire - il n'y a pas besoin d'élément de <column> imbriqué; vous pouvez avoir comme attribut au lieu ou de l'ignorer complètement si le nom de colonne correspond nom de la propriété. De même, aucun point en ayant mise à jour = false partout - si vous ne voulez pas que vos messages mis à jour, ne les enregistre pas: -)

Autres conseils

Pour moi, ce problème a été provoqué en essayant de faire référence à une propriété plutôt que la plaquant.

Dans la syntaxe couramment que je faisais ce (faux!).

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

Au lieu de cela (corriger!).

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

Où AdvertExpiryDays était un int pas une entité.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top