Hibernate: eccezione associazione di classe non mappata
-
21-09-2019 - |
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!
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:
- 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. - 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 . - Elenco Commento in realtà dovrebbe essere mappata con inverse = true.
- 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à.