2009-03-22 5 views
7

Ich habe ein Buchmodell und ein Inventarmodell nach ISBN-Nummer zugeordnet, aber ISBN ist nicht der Primärschlüssel in beiden. Bücher gehören zu Buchhandlungen und Inventar ist für eine Gruppe von Buchhandlungen (BookstoreChain). Das Inventar wird von allen Bookstores geteilt, die zu einem BookstoreChain gehören.ORM: OneToOne-Zuordnung in der Nicht-Primärschlüssel-Join-Spalte - Buch und Inventar nach ISBN

Ich verwende das Hibernate @ OneToOne-Mapping auf der Buchseite, um Inventarinformationen abzurufen, indem ich der ISBN-Spalte beitrete. Irgendwie erzeugt Hibernate die linke Outer-Join-Abfrage korrekt, aber Inventar ist Null für das Book-Objekt. Es ist auch nicht faul geladen. Wie kann ich OneToOne oder ManyToOne beim Zugriff auf Books und beim Abrufen von Inventar beim Ignorieren des Bookstore und der Chain anmelden?

Antwort

0

nur eine Vermutung: ist name = 'ISBN' muss der gleiche Fall wie das Feld in Inventory sein?

+0

Das ist kein Problem. Der angezeigte Code ist nur indikativ. Das eigentliche Problem liegt irgendwo in der OneToOne – Sathish

+0

ok - du hast mich. Ich verwende noch keine Anmerkungen zu meinem Hibernate-Projekt. Sie können nur überprüfen, ob die Daten tatsächlich die Beziehung haben. – Martlark

1

Ich bezweifle, dass dies nichts mit dem Thema zu tun hat, aber ich dachte, ich würde es sowieso nur bringen, um sicherzustellen, dass es nicht ein gotcha ist, die übersehen wurde:

Beachten Sie, dass, wenn mit referencedColumnName zu einer nicht-primären Schlüsselspalte, die zugehörige Klasse hat , um serialisierbar zu sein.

Referenz: [http://docs.jboss.org/ejb3/app-server/HibernateAnnotations/reference/en/html_single/index.html][1]

Ich weiß, Sie haben gesagt, die LEFT OUTER JOIN erzeugt wird, aber ich dachte, dass die Standard-Abruf LAZY war, wenn es nicht angegeben wurde. Vielleicht kann die explizite Angabe des Abrufmodus zu anderen Ergebnissen führen.

Schließlich, wenn Sie eine HQL-Abfrage verwenden, hilft die Veröffentlichung dieser mit anderen Entitätsklassen der Community bei der Lösung des Problems.

+0

Inventar ist serialisierbar. OneToOne ist standardmäßig eifrig. Ich verwende nur eine Kriterienabfrage, um Buch nach ISBN auszuwählen und zu prüfen, ob ich Inventardetails erhalte – Sathish

1

Ihr Datenbankschema macht keinen Sinn, basierend auf dem, was Sie hier gezeigt haben. Die Beziehung zwischen Buch und Inventar sollte eins zu viele sein - vermutlich befindet sich das gleiche Buch in mehreren Inventaren, was bedeutet, dass Sie Bücher und Inventare nicht nur mit dem isbn verknüpfen können. Da der isbn nicht in Inventaren eindeutig ist, haben Sie mehrere Zeilen im Inventar mit demselben isbn, aber anderen chainIds - welche Zeile ist die richtige Zeile für ein bestimmtes Buch/isbn? Buch sollte einen Fremdschlüssel für inventory.id haben, nicht inventory.isbn.

3

Sie müssen Ihre Join-Referenz etwas anderes nennen. isbn ist schon eine Spalte. Versuchen Sie dies:

@OneToOne(optional = true) 
@JoinColumn(name = "inventory", referencedColumnName = "isbn",insertable = false, updatable = false) 
Inventory inventory;