Domanda

So che questo dovrebbe essere un problema abbastanza elementari da risolvere, ma 1) Sono relativamente nuovo a Hibernate, e 2) le correzioni che ho trovato non (sembra) si applicano qui.

Questa è l'eccezione che sto ottenendo:

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)

Ciò si verifica quando Hibernate tenta di configurare se stessa.

Gli oggetti con cui sto lavorando sono gli utenti, Post (superclasse astratta), stati e Commenti (sottoclassi concrete della Posta). Ognuno di essi è di fagioli da uno dei due tavoli: utenti che contenuti. Gli oggetti Utente sono abbastanza vaniglia: un sacco di campi blando che descrivono l'utente. Oltre ai campi in modo simile noioso, uno stato e un commento hanno entrambi proprietari (User che ha postato). Ciò che differenzia uno Stato da un commento è che uno Stato può avere un elenco di commenti ad esso, ma nessun genitore, mentre un commento non ha figli messaggi, ma ha un genitore (sì, questo è fondamentalmente Facebook).

Da quello che ho letto, il problema sembra essere nelle mappature molti-a-uno, ma io non riesco a trovare nulla di male. Ecco le tre file di configurazione che sto 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>

Ho la sensazione che ho bisogno di specificare da qualche parte il fatto che una di stato contiene un ArrayList di commento di, ma non è così fatto implicitamente attraverso la "lista" di costruire nel Post.hbm.xml lima?

Il codice XML file esistono nel mio classpath (WEB-INF / classes), e il .java file stessi sono visibili all'applicazione pure. Approfondimenti sarebbe apprezzato!

È stato utile?

Soluzione

L'eccezione che hai postato è causato da voi specificare esplicitamente un nome di entità sulla dichiarazione <class> e non specificarlo sulla <many-to-one>. Nome entità è una speciale attributo utilizzato per distinguere tra le diverse mappature basate sulla stessa classe. NON è necessario per voi mappatura.

Detto questo, ci sono più problemi supplementari con la mappatura:

  1. mappatura <one-to-one> per il genitore è sbagliato. Non può essere uno-a-uno, per definizione - mentre questo dopo avrà un solo genitore, un altro post può avere lo stesso genitore (soprattutto per i commenti), che rende fine del genitore di associazione uno-a -molti. È necessario mappare come <many-to-one> invece.
  2. Elenco dei commenti non è davvero un elenco a meno che non si dispone di una colonna speciale per mantenere il suo indice (che non a giudicare dal vuoto - e non valida - Dichiarazione <index/>). Mappa come <bag> invece .
  3. Elenco Commento in realtà dovrebbe essere mappata con inverse = true.
  4. Non è un problema di per sé, ma rende la mappatura più difficile da leggere - non c'è bisogno per l'elemento <column> nidificato; si può avere come attributo invece o saltare del tutto se il nome di colonna corrisponde nome della proprietà. Allo stesso modo, non ha senso avere aggiornamento = false in tutto il mondo - se non si desidera che i tuoi messaggi aggiornato, non salvarli: -)

Altri suggerimenti

Per quanto mi riguarda questo problema è stato causato da cercando di riferimento a una proprietà, piuttosto che la mappatura di esso.

Nella sintassi fluente stavo facendo questo (sbagliato!).

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

Invece di questo (corretto!).

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

Dove AdvertExpiryDays era un NON int un'entità.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top