-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 
Author Message
 Post subject: Mapping von Primär- und Fremdschlüssel
PostPosted: Sun Jun 17, 2007 5:03 pm 
Newbie

Joined: Mon May 14, 2007 5:49 am
Posts: 17
Hallo Zusammen,

bin noch relativ neu bei Hibernate und stoße nun auf ein Problem für das ich leider keine Lösung gefunden habe bei Google. :)

Ich habe eine Tabelle die einen Primary Key (PK), einen Primary-und Fremdschlüssel (PFK) und 2 Fremdschlüssel (FK) hat.


Der Primary Key und die beiden Fremdschlüssel bereiten mir eigentlich keine Probleme ... allerdings dieser Primary- und Fremdschlüssel.

Ich habe auch eine Tabelle mit 3 PFKs ... das war auch kein Problem.

Mein Mapping habe ich bisher soweit:

Code:
<hibernate-mapping>
    <class name="package.hibernate.Spiel" table="spiel">
        <id name="spiel_id" type="java.lang.Integer">
            <column name="SPIEL_ID" />
            <generator class="increment" />
        </id>
       
       
        <!-- Die Fremdschlüssel -->
        <many-to-one name="team_id" class="package.hibernate.Team" fetch="select">
            <column name="TEAM1_ID" />
        </many-to-one>
        <many-to-one name="team_id" class="package.hibernate.Team" fetch="select">
            <column name="TEAM2_ID" />
        </many-to-one>
       
        <!-- Restlichen Properties -->
        <property name="team1_tore" type="java.lang.String">
            <column name="TEAM1_TORE" not-null="true"/>
        </property>
        <property name="team2_tore" type="java.lang.String">
            <column name="TEAM2_TORE" not-null="true"/>
        </property>


    </class>
</hibernate-mapping>


Folgende DB Tabelle will ich mappen:

Spiel_ID - Integer - PK
Wettbewerb_ID - Integer - PFK
Team1_ID - Integer - FK
Team2_Tore - Integer
Team2_ID - Integer - FK
Team2_Tore - Integer

In meiner Java Klasse sieht es so aus:

Code:
public class Spiel {
   
   private int Spiel_ID; // PK
   
   private int Wettbewerb_ID; // PFK
   
   private int Team1_ID; // FK
   
   private int Team2_ID; // FK
   
   private int Team1_Tore;
   
   private int Team2_Tore;


Mein Problem ... wie bekomme ich den PFK in mein Mapping?!?

Versteht ihr was ich will? :) Vielleicht kann ja jemand helfen.

Besten Dank.

Viele Grüße
Oliver


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jun 18, 2007 5:12 am 
Regular
Regular

Joined: Thu Jan 27, 2005 8:58 am
Posts: 80
Hi erstmal vorab:

Code:
<property name="team1_tore" type="java.lang.String">
            <column name="TEAM1_TORE" not-null="true"/>
        </property>

Du mappst den Wert als String.
Sagst aber im Code:
Code:
private int Team1_Tore;

Da gibt es 2 Probleme:
1. Die Properties sollten in Deiner Java-Klasse schon Objekte sein-->Integer
2. Du mappst den Wert als String und definierst in der Klasse nur einen Integer, so wird Hibernate den Wert nicht zu ordnen können!

Weiter im Text:
Code:
<many-to-one name="team_id" class="package.hibernate.Team" fetch="select">
            <column name="TEAM1_ID" />
        </many-to-one>

Code:
private int Team1_ID; // FK


Auch hier musst Du in der Klasse den Typ verwenden den Du gemappt hast, also:
Code:
<many-to-one name="team1" class="package.hibernate.Team" fetch="select">
            <column name="TEAM1_ID" />
        </many-to-one>


Code:
private Team team1; // FK


Wenn Du wirklcih nur die reinen IDs haben willst und nicht die daranhängenden Daten solltest Du die FKs als properties mappen.

Nun zum eigentlichen Problem
Dein PFK ist doch vermutlich der PK einer anderen Tabelle oder?
Dann ist das doch ein ganz normaler FK und kann wie alle anderen gemappt werden.

Code:
<many-to-one name="wettbewerb" class="package.hibernate.Wettbewerb">
            <column name="WETTBEWERB_ID" />
        </many-to-one>

Code:
private Wettbewerb wettbewerb;

_________________
Weise ist nicht, wer viele Erfahrungen macht, sondern wer aus wenigen lernt, viele nicht machen zu müssen. (Karlheinz Deschner)


Top
 Profile  
 
 Post subject:
PostPosted: Mon Jun 18, 2007 2:24 pm 
Newbie

Joined: Mon May 14, 2007 5:49 am
Posts: 17
FPC wrote:
Hi erstmal vorab:

Auch hier musst Du in der Klasse den Typ verwenden den Du gemappt hast, also:
Code:
<many-to-one name="team1" class="package.hibernate.Team" fetch="select">
            <column name="TEAM1_ID" />
        </many-to-one>


Code:
private Team team1; // FK


Wenn Du wirklcih nur die reinen IDs haben willst und nicht die daranhängenden Daten solltest Du die FKs als properties mappen.

Nun zum eigentlichen Problem
Dein PFK ist doch vermutlich der PK einer anderen Tabelle oder?
Dann ist das doch ein ganz normaler FK und kann wie alle anderen gemappt werden.

Code:
<many-to-one name="wettbewerb" class="package.hibernate.Wettbewerb">
            <column name="WETTBEWERB_ID" />
        </many-to-one>

Code:
private Wettbewerb wettbewerb;


Der PFK ist in "seiner" Tabelle der PK, das stimmt. Dann ist es ja recht einfach.

Aber noch eine Frage: Warum sollte ich die, insgesamt dann 3 FKs als normale Properties mappen und nicht als FKs mit <many-to-one>? Die IDs die dort verwendet werden sollen sollen ja schliesslich in den anderen Tabellen vorhanden sein, deswegen habe ich sie ja als FKs definiert.

Warum also beim Hibernate Mapping darauf verzichten?

Danke und Gruß
Oliver


Top
 Profile  
 
 Post subject:
PostPosted: Tue Jun 19, 2007 2:56 am 
Regular
Regular

Joined: Thu Jan 27, 2005 8:58 am
Posts: 80
Ich würde nicht darauf verzichten, aber wenn man sich Deine Mappings bzw. Deine Java-Klassen so anschaut, könnte man aber meinen, dass Du das versucht hast.

Quote:
private int Team1_ID; // FK


Du musst in diesem Zusammenhang weiterhin objektorientiert denken! Gerade wenn Du einen FK als Many-to-one mappst, wirst Du nicht die ID (schon gar nicht als primitiven Datentyp) erhalten sondern eine Instanz des Objektes der gemappten Tabelle zu der der FK führt!

Es kann sein, dass man auf das Mappen von Beziehungen verzichtet, wenn Du zu viele FKs zu anderen Tabellen hättest. Wenn Du nun eine Abfrage startest, startet Hibernate auch für jeden gefundenen Datensatz eine weitere Abfrage pro gemappter FK um die Daten zu erhalten. Dies kann bei größeren Datenmengen und / oder hoher Verschaltungstiefe zu enormen Perfomance-Einbußen führen!

_________________
Weise ist nicht, wer viele Erfahrungen macht, sondern wer aus wenigen lernt, viele nicht machen zu müssen. (Karlheinz Deschner)


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 20, 2007 2:16 am 
Newbie

Joined: Mon May 14, 2007 5:49 am
Posts: 17
Hast du natürlich Recht.

Ich brauch schon das Object "Team" und nicht nur die ID (brauche den Namen des Teams und der steht nur in der Tabelle Team, also brauche ich schon das Object Team).

Ich habe allerdings das ganze als Integer definiert und nicht als Object Team, weil ich ja in der Tabelle "Spiel", für die ich hier gerade das Mapping mache, nur die ID von einem Team bzw. von 2 Teams stehen haben will.

Wenn ich das Mapping so mache wie von dir vorgeschlagen, sprich:

FPC wrote:
Auch hier musst Du in der Klasse den Typ verwenden den Du gemappt hast, also:
Code:
<many-to-one name="team1" class="package.hibernate.Team" fetch="select">
      <column name="TEAM1_ID" />
</many-to-one>

private Team team1; // FK



Da frage ich mich natürlich wie ich Hibernate noch sage, dass er bitte die ID von Team in die Tabelle von Spiel schreiben soll ... oder muss ich das überhaupt machen .. oder nimmt sich Hibernate einfach den Primary Key von der Tabelle Team?!?

Das ist mir noch nicht ganz klar.

Danke für deine Hilfe.

Gruss Oliver


Top
 Profile  
 
 Post subject:
PostPosted: Wed Jun 20, 2007 4:28 am 
Regular
Regular

Joined: Thu Jan 27, 2005 8:58 am
Posts: 80
Quote:
... oder muss ich das überhaupt machen .. oder nimmt sich Hibernate einfach den Primary Key von der Tabelle Team?!?


Du hast es erfasst! Hibernate kann den PK durch das Mapping erkennen und wird alles dementsprechend in die Datenbank hauen.

Ein Problem wirst Du nur bekommen, wenn das Team noch nicht persistent ist, sprich noch keine ID hat auf die verwiesen werden könnte. In dem Fall musst Du ggf. zuerst das Team Speichern und dann das Spiel.

Ich kann Dir ein Beispiel aus meinem Umfeld nennen, wo ich auf das Problem gestossen bin:

Ein Mitarbeiter hat eine Adresse. Werden beide komplett neu angelegt (transient) muss ich zuerst die Adresse persistieren, bevor ich den Mitarbeiter speichern kann. Sonst wird eine Exception geworfen, dass Du einen FK auf ein transientes Objekt legen willst.

_________________
Weise ist nicht, wer viele Erfahrungen macht, sondern wer aus wenigen lernt, viele nicht machen zu müssen. (Karlheinz Deschner)


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 6 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.