2015-07-17 9 views
10

Hallo, ich habe 2 Tabellen wie untenHibernate Viele einen Mapping mit unterschiedlicher Anzahl der Spalten

Tabelle 1:

 

    +-------------------+ 
    | ID LOB col1 col2 | 
    +-------------------+ 

Primärschlüssel (ID und LOB)

Tabelle 2:

 

    +-----------------+ 
    | SK ID col3 col4 | 
    +-----------------+ 

Primärschlüssel (SK)

I Notwendigkeit, eine viele zu einer Beziehung von Tabelle 2 zu tabelle1, zu geben, da tabelle1 hat compositePrimaryKey (ID und LOB) aber table2 hat keine Spalte mit Bezug zu LOB. Ich kann das Mapping nicht bereitstellen. Bitte helfen Sie dabei.

EDIT ich Hibernate Mapping für Table2 versucht:

<many-to-one name="class1Obj" class="com.acs.enterprise.common.Class1" 
      lazy="proxy" insert="false" update="false"> 
    <column name="ID" /> 
    <column name="LOB" /> 
</many-to-one> 

Die obige nicht funktioniert. Während eine Aufzeichnung zu holen versucht es LOB-Code von table2 zu holen, die überhaupt nicht

in Tabelle 1 existieren table2.SK
+0

Würden Sie bitte Code für die Klassen und die Ausgabe, die Sie bekommen, bitte. –

+0

Wenn die zweite Tabelle keinen Bezug zu LOB hat, können Sie den zusammengesetzten Schlüssel nicht zuordnen. Können Sie Tabelle2 eine LOB-Spalte hinzufügen? – Hace

Antwort

2

Unter der Annahme eines FK table1.ID ist und es gibt keine table1 Einträge die gleiche ID haben, können Sie die Zuordnung wie folgt schreiben:

@ManyToOne 
@JoinColumn(name = "ID", insertable = false, updatable = false) 
private Class1 class1Obj; 

Wenn mehr table1 Zeilen mit der gleichen ID sind, wird die Zuordnung fehlschlagen, weil ein Kind würde dann auf mehrere Eltern angepasst werden.

Also, für eine ordnungsgemäße many-to-one Zuordnung benötigen Sie eine FK zu einer übergeordneten Spalte, die einzigartig ist.

+0

Danke für die Antwort, aber die obige Zuordnung ist fehlgeschlagen, da Tabelle1 Composite-ID in Hibernate Mapping deklariert hat, viele-zu-eins fragt auch nach der gleichen Anzahl von Spalten – Siva

+0

Ich weiß, es funktioniert mit JPA-Anmerkungen, aber für den alten Hibernate Spezifische XML-Konfigurationen, ich bin mir nicht sicher, was das Äquivalent ist. –

0

Hibernate @Id muss nicht dem echten Primärschlüssel der Datenbank entsprechen (obwohl es wünschenswert ist, dass sie natürlich übereinstimmen).

Wenn ID eine eindeutige Spalte in Table1 ist, dann map Hibernate id nur, und lassen Sie LOB als nur ein gewöhnliches Feld.

Wenn ID keine eindeutige Spalte ist, wird Ihre Viele-zu-Eins-Verknüpfung trotzdem nicht ordnungsgemäß funktionieren, da in der referenzierten Tabelle mehrere übereinstimmende Zeilen vorhanden sind.

-1
@Entity 
@Table(name="Table_name") 
public class table_name { 
@EmbeddedId 
@AttributeOverrides({ 
@AttributeOverride(name = "id1", column = @Column(name = "col1")), 
@AttributeOverride(name = "id2", column = @Column(name = "col2")) }) 
+4

Könnten Sie Ihrer Antwort eine Erklärung hinzufügen? – madshvero

+1

Vielen Dank für dieses Code-Snippet, das eine begrenzte, sofortige Hilfe bieten kann. Eine [richtige Erklärung] (https://meta.stackexchange.com/q/114762/349538) würde ihren langfristigen Wert erheblich verbessern, indem sie zeigt, warum dies eine gute Lösung für das Problem ist und es nützlicher machen würde an zukünftige Leser mit anderen, ähnlichen Fragen. Bitte [bearbeiten] Sie Ihre Antwort , um einige Erklärungen hinzuzufügen, einschließlich der Annahmen, die Sie getroffen haben. –

Verwandte Themen