Pregunta

Sé que esto debe ser un tema bastante elemental de solucionar, pero 1) Soy relativamente nuevo en hibernación, y 2) las correcciones que he encontrado no (parece que) se aplican aquí.

Aquí está la excepción que estoy recibiendo:

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)

Esto ocurre cuando Hibernate intenta configurarse a sí mismo.

Los objetos con los que trabajo son usuarios, Entradas (superclase abstracta), de los estados y Comentarios (subclases concretas del post). Cada uno es de frijol de uno de los dos cuadros siguientes: Usuarios y postes. Los objetos de usuario son bastante vainilla: una gran cantidad de campos que describen el usuario sosos. Además de los campos aburridos del mismo modo, un estado y un comentario a ambos tienen propietarios (usuario que lo publicó). Lo que diferencia a un estado de un comentario es que un Estado puede tener una lista de comentarios adjuntos a ella, pero ninguno de los padres, mientras que un comentario no tiene publicaciones infantiles, pero tiene un padre (sí, esto es, básicamente, Facebook).

Por lo que he leído, el problema parece estar en las asignaciones de muchos-a-uno, pero me parece que no puede encontrar nada malo. Éstos son los tres archivos de configuración que estoy usando.

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>

Me da la sensación de que necesito para especificar alguna parte del hecho de que un Estado contiene un ArrayList de la Observación de, pero no se hace eso implícitamente a través de la "lista" construir en el Post.hbm.xml presentar?

El xml existen archivos en mi ruta de clase (WEB-INF / classes), y el .java propios archivos son visibles para la aplicación también. Ideas serán bienvenidos!

¿Fue útil?

Solución

La excepción que has enviado es causado por que especificar explícitamente un nombre de entidad en la declaración <class> y no especificando en <many-to-one>. nombre de la entidad es una atributo especial se utiliza para distinguir entre diferentes asignaciones en base a la misma clase. Usted no lo necesita para que la cartografía.

Dicho esto, hay varios problemas adicionales con su mapeo:

  1. mapeo <one-to-one> para los padres es erróneo. No puede ser de uno a uno, por definición, - mientras que este puestos de trabajo sólo tendrá uno de los padres, otro post puede tener el mismo padre (sobre todo para los comentarios) que hace que el final de los padres de la asociación de uno a -muchos. Es necesario hacer un mapa como <many-to-one> lugar.
  2. Lista de comentarios no es realmente una lista a menos que tenga una columna especial para mantener su índice (que no a juzgar por vacío - y no válidos - Declaración <index/>). Mapa como <bag> vez .
  3. Lista de comentarios realmente debe correlacionarse con la inversa = true.
  4. No es un problema en sí, sino que hace que su asignación más difícil de leer - no hay necesidad de <column> elemento anidado; se puede tener como atributo en lugar o saltar por completo si el nombre de la columna coincide con nombre de la propiedad. Del mismo modo, hay razón para tener actualización = false en todas partes - si usted no quiere que sus mensajes actualizados, no se libró; -)

Otros consejos

Para mí, este problema se debía a que intenta hacer referencia a una propiedad en lugar de la cartografía de la misma.

En la sintaxis fluida que estaba haciendo esto (mal!).

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

En lugar de esto (corregir!).

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

Cuando AdvertExpiryDays fue un NO int una entidad.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top