Frage

Ich weiß, dass dies ein ziemlich elementares Problem zu beheben sein sollte, aber 1) I zu Hibernate relativ neu bin, und 2) die Updates die ich gefunden habe nicht (scheint hier) gilt.

Hier ist die Ausnahme, die ich bin immer:

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)

Dies geschieht, wenn Hibernate versucht sich selbst zu konfigurieren.

Die Objekte Ich arbeite mit sind Benutzer, Beiträge (abstrakte Superklasse), Status und Kommentare (konkrete Subklassen von Post). Jeder ist Bohne aus einem von zwei Tabellen: Benutzer und BEITRäGEN. Die Benutzerobjekte sind ziemlich Vanille: viele faden Felder der Benutzer beschreiben. Neben ähnlich langweilige Felder, ein Status- und einen Kommentar haben beide Besitzer (Benutzer, die es geschrieben). Was unterscheidet einen Status in einem Kommentar, dass ein Status-Liste Kommentare an es haben kann, aber kein Elternteil, während ein Kommentar keine Kinder Beiträge hat, hat aber einen Elternteil (ja, das ist im Grunde Facebook).

Von dem, was ich gelesen habe, scheint das Problem in den many-to-one-Zuordnungen zu sein, aber ich kann nicht scheinen, etwas falsch zu finden. Hier sind die drei Konfigurationsdateien ich verwende.

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>

ich das Gefühl, ich brauche irgendwo die Tatsache angeben, dass ein Status eine Arraylist von Kommentar des enthält, ist aber nicht, dass implizit durch das „Liste“ Konstrukt in der Post.hbm.xml Datei getan?

Die XML-Dateien existieren in meinem Classpath (WEB-INF / classes) und die .java-Dateien selbst sind für die Anwendung als auch. Insights würde geschätzt!

War es hilfreich?

Lösung

Die Ausnahme, die Sie geschrieben haben, ist durch Sie explizit eine Entität Namen auf <class> Deklaration spezifiziert und es nicht auf <many-to-one> angeben. Entity-Name ist ein spezielles Attribut verwendet für basiert auf der gleichen Klasse zwischen verschiedenen Zuordnungen zu unterscheiden. Sie brauchen es nicht für Sie zuordnen.

sagte, dass es mehrere zusätzliche Probleme mit der Zuordnung:

  1. <one-to-one> Mapping für Eltern ist falsch. Es kann nicht eines-zu-eins per Definition sein - während diese Post nur einen Elternteil hat, eine andere Stelle, dass die gleich Eltern, das Ende der Vereinigung der Eltern eines zu machen hat (vor allem für Kommentare) -viele. Sie müssen es als <many-to-one> abzubilden statt.
  2. Liste der Kommentare ist nicht wirklich eine Liste, wenn Sie eine spezielle Spalte seinen Index zu erhalten (die Sie urteilen nicht durch leere - und ungültig - <index/> Erklärung). Karte als <bag> statt .
  3. Kommentarliste sollte wirklich mit inverser = true abgebildet werden.
  4. Kein Problem per se, aber es macht Ihre Zuordnung schwieriger zu lesen - es gibt keine Notwendigkeit für verschachteltes <column> Element; Sie können es als Attribut statt oder ganz überspringen, wenn Spaltennamen Eigenschaftsnamen übereinstimmt. In ähnlicher Weise falsch kein Punkt Update mit = überall - wenn Sie nicht Ihre Beiträge aktualisiert wollen, nicht speichern sie: -)

Andere Tipps

Für mich war dieses Problem verursacht, indem Sie versuchen eine Eigenschaft zu verweisen, anstatt sie abzubilden.

In fließend Syntax ich tat dies (falsch!).

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

Anstatt diese (richtige!).

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

Wo AdvertExpiryDays ein int war keine Einheit.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top