2016-06-20 5 views
-1

Ich bin jetzt für einen Moment stecken und ich brauche Hilfe.Mapping in Hibernate auf einem anderen Feld als die PK

Ich will eine Zuordnung in Hibernate haben zwischen zwei Feldern, die nicht in einem der beiden Tabellen PK sind

Table Category (
    catId Numeric(10), 
    categoryBusinessRef Numeric(10) 
) 


Table Product (
    productId Numeric(10), 
    categoryBusinessRef Numeric(10) 
) 

Die SQL-Abfrage wäre:

SELECT * 
    from Category as a 
    Join Product as b on a.categoryBusinessRef = b.categoryBusinessRef 

Aber in Hibernate es mir machen diese Zuordnung

SELECT * 
    from Category as a 
    Join Product as b on a.categoryId = b.categoryBusinessRef 

Mein HBMs sieht gefällt

<class name="Category" table="A"> 
     <id name="categoryId" length="10"> 
      <column name="categoryid" /> 
      <generator class="sequence"> 
       <param name="sequence">S_category</param> 
      </generator> 
     </id> 
     <set name="categoryBusinessRefs" table="B" > 
      <key> 
       <column name="categoryBusinessRef" /> 
      </key> 
      <one-to-many class="ProductClass" /> 
     </set> 
</class> 

<class name="Product" table="B"> 
     <id name="productId" length="10"> 
      <column name="productid" /> 
      <generator class="sequence"> 
       <param name="sequence">S_product</param> 
      </generator> 
     </id> 
     <property name="categoryBusinessRef" length="10"> 
      <column name="categoryBusinessRef" /> 
     </property> 
</class> 

So ist es eine One-to-many-Beziehung, aber es hat mit anderen Werten als die PK der Kategorie

Danke für die Hilfe

EDIT zur Karte:

Wenn ich kann‘ t mach das ok! Aber wenn ich das tun kann, weiß ich alles mit dem Primärschlüssel, aber meine Frage ist nicht "Mapping in Hibernate on PK", sondern "Mapping in Hibernate auf einem anderen Feld als der PK", so die Antworten, die Karte sagte PK interessiert mich nicht: p

+0

Ich denke, Tabelle 'A' ist die' 1'-Seite einer OneToMany-Relation, richtig? Dann ist das Attribut "Scheibe" in der Tabelle "A" falsch. – JimHawkins

+0

Ich habe keine Warennamen gewählt Ich denke, ich werde diese Variablen umbenennen –

+0

es ist keine Frage von guten oder schlechten Namen. War meine Annahme richtig? – JimHawkins

Antwort

1

Ihr Modell ist falsch, es sei denn, Sie möchten ein kartesisches Produkt (es ist eine seltene Anforderung) Sie sollten immer durch den Primärschlüssel beitreten.

Sie können eins-zu-eins, eins-zu-viele oder viele-zu-viele Beziehungen haben (die letzten beiden sind häufiger).

In one-to-many benötigen Sie die pk der one Seite in der many Seite.

In vielen zu können Sie eine Beziehungstabelle, die das Mapping macht.

Angenommen, dass Sie wollen, dass viele B 's verbinden mit dem gleichen A (so eins zu viele).

CREATE TABLE a (
    id NUMERIC(10) PRIMARY KEY, 
    disc NUMERIC(10) NOT NULL 
) 

CREATE TABLE b (
    id NUMERIC(10) PRIMARY KEY, 
    a_id NUMERIC(10) NOT NUL REFERENCES a (id) 
) 

Jetzt können Sie

SELECT * 
FROM a 
JOIN b ON b.a_id = a.id 

abfragen und alle Scheiben aus a mit dem richtigen Verhältnis zu allen b erholen.

+0

Ja, aber ich muss zuordnen andere Felder wegen einer Historisierungen der Datenbank, jedes Update benötigt eine neue Datensätze, so gibt es eine ID für die Zeile und eine ID für die Darstellung der Daten für das Geschäft –

+0

Aber in vielen Fällen müssen Sie auf bestimmte Wert, dass zuordnen sind nicht Primärschlüssel (z. B. in großen Daten) –

+0

@GillesBodart Der PK muss das Tupel eindeutig identifizieren, daher werden alle Zuordnungen vom PK vorgenommen, Sie sollten nur auf Nicht-PK-Felder beschränken relationale Datenbank –