Hibernate: Nicht zugeordnete Klassenzuordnungsausnahme

8

Ich weiß, dass dies ein ziemlich elementares Problem sein sollte, aber 1) Ich bin relativ neu in Hibernate, und 2) die Fixes, die ich gefunden habe, gelten hier nicht (scheinen).

Hier ist die Ausnahme, die ich bekomme:

%Vor%

Dies tritt auf, wenn Hibernate versucht, sich selbst zu konfigurieren.

Die Objekte, mit denen ich arbeite, sind Benutzer, Beiträge (abstrakte Oberklasse), Status und Kommentare (konkrete Unterklassen von Post). Jeder ist Bean aus einer von zwei Tabellen: USERS und POSTS. Die Benutzerobjekte sind ziemlich Vanille: viele fade Felder beschreiben den Benutzer. Zusätzlich zu ähnlich langweiligen Feldern haben ein Status und ein Kommentar beide Besitzer (Benutzer, der sie gepostet hat). Was unterscheidet einen Status von einem Kommentar ist, dass ein Status eine Liste von Kommentaren haben kann, aber keine Eltern, während ein Kommentar keine Kinder Beiträge, sondern hat ein Elternteil (ja, das ist im Grunde Facebook).

Nach dem, was ich gelesen habe, scheint das Problem in den Eins-zu-eins-Abbildungen zu liegen, aber ich kann nichts falsch finden. Hier sind die drei Konfigurationsdateien, die ich benutze.

hibernate.cfg.xml:

%Vor%

User.hbm.xml:

%Vor%

Post.hbm.xml:

%Vor%

Ich habe das Gefühl, ich muss irgendwo die Tatsache angeben, dass ein Status eine ArrayList von Kommentaren enthält, aber wird das nicht implizit durch das "list" -Konstrukt in der Post.hbm.xml-Datei gemacht?

Die XML-Dateien existieren in meinem Klassenpfad (WEB-INF / classes) und die .java-Dateien selbst sind für die Anwendung ebenfalls sichtbar. Einblicke wären wünschenswert!

    
Magsol 14.10.2009, 04:40
quelle

2 Antworten

17

Die von Ihnen gepostete Ausnahme wird dadurch verursacht, dass Sie explizit einen Entitätsnamen in <class> declaration angeben und ihn nicht in <many-to-one> angeben. Der Entitätsname ist ein spezielles Attribut , das verwendet wird Unterscheiden zwischen verschiedenen Zuordnungen basierend auf derselben Klasse. Sie brauchen es nicht für Ihr Mapping.

Allerdings gibt es mehrere zusätzliche Probleme mit Ihrem Mapping:

  1. <one-to-one> Mapping für Eltern ist falsch. Es kann per Definition nicht Eins-zu-eins sein - während dieser Beitrag nur einen Elternteil hat, kann ein anderer Beitrag denselben Elternteil haben (besonders für Kommentare), was das Ende der Assoziation der Eltern zu eins macht -viele. Sie müssen es stattdessen als <many-to-one> zuordnen.
  2. Die Liste der Kommentare ist nicht wirklich eine Liste, es sei denn, Sie haben eine spezielle Spalte, um ihren Index zu verwalten (den Sie nicht als leer betrachten - und ungültig - <index/> -Deklaration). Ordnen Sie es stattdessen als <bag> zu.
  3. Die Kommentarliste sollte wirklich mit inverse = true abgebildet werden.
  4. Kein Problem per se, aber es macht das Mapping schwerer lesbar - es besteht keine Notwendigkeit für verschachtelte <column> element; Sie können es stattdessen als Attribut verwenden oder es ganz überspringen, wenn der Spaltenname mit dem Eigenschaftsnamen übereinstimmt. Genauso wenig, wenn update = false überall ist - wenn Sie nicht möchten, dass Ihre Beiträge aktualisiert werden, speichern Sie sie nicht: -)
ChssPly76 14.10.2009, 05:40
quelle
2

Für mich wurde dieses Problem dadurch verursacht, dass versucht wurde, eine Eigenschaft zu referenzieren, anstatt sie zuzuordnen.

In fließender Syntax habe ich das gemacht (falsch!).

%Vor%

Statt dies (richtig!).

%Vor%

Where AdvertExpiryDays war ein Int KEINE Entität.

    
CountZero 20.07.2012 13:02
quelle