-->
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: Autoinc fremdschlüssel
PostPosted: Tue Mar 13, 2007 4:48 pm 
Beginner
Beginner

Joined: Sat Dec 09, 2006 12:02 pm
Posts: 26
Hi,

ich habe ein lustiges Problem, welches garantiert nicht in den FAQs steht.

Ich habe zwei Tabellen, eine Kunde und eine KundeAdresse. (Eigentlich in englisch, aber egal). Die Adressen werden von den anderen Kundendaten aus performancegründen getrennt.

Die Tabelle Kunden enthält eine Spalte ID, welche ein autoinc primärschlüssel ist. Die Tabelle KundeAdresse enthält eine Spalte KundeID, welche vom Typ integer ist und nur ein Primärschlüssel.

Die Tabelle Kunde verweist mit der Spalte ID auf die Spalte KundeID der Tabelle KundeAdresse als Fremdschlüssel. Ok, hoffe das ist soweit verständlich. (Kunde.ID -> KundeAdresse.KundenID)

Wenn ich nun einen neuen Kunden anlege, dann werfe ich alle Informationen ins Objekt Kunde. Weiterhin lege ich ein neues Objekt KundeAdresse an, welches ja schon in dem Objekt Kunde vorhanden ist.
Wenn ich aber nun speichern will, dann bekomme ich eine Exception, dass eine Fremdschlüsselviolation aufgetreten ist. Also bei der Spalte ID der Tabelle Kunde wird ja, da es ein AutoInc ist, beim Speichern ein neuer Wert zugewiesen, sagen wir mal die 5. Aber bei den Adressen steht die 5 noch nicht drin. Da steht gar nichts drin, aber er erwartet dort die 5.

Weiss jemand, wie ich Hibernate sagen kann, dass er bei Fremdschlüsseln natürlich auch den Wert übertragen soll?


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 14, 2007 2:08 am 
Expert
Expert

Joined: Tue Nov 23, 2004 7:00 pm
Posts: 570
Location: mostly Frankfurt Germany
One-2-One Beziehung oder eine Component mit den Component Daten in einer zweiten Tabelle.
Ich bin mir nicht sicher, ob die Hibernate Reference ein Beispiel dazu hat. Evt. gibt es eins in den Tests zu Hibernate.

_________________
Best Regards
Sebastian
---
Training for Hibernate and Java Persistence
Tutorials for Hibernate, Spring, EJB, JSF...
eBook: Hibernate 3 - DeveloperGuide
Paper book: Hibernate 3 - Das Praxisbuch
http://www.laliluna.de


Top
 Profile  
 
 Post subject:
PostPosted: Wed Mar 14, 2007 5:04 am 
Beginner
Beginner

Joined: Sat Dec 09, 2006 12:02 pm
Posts: 26
Mhh, das hilft mir leider nicht sehr viel weiter.
Ich kann doch nicht der erste sein, der dieses Problem hat. Irgendjemand hier muss doch wissen, welche kleine Einstellung man da bei Hibernate vornimmt, damit er automatisch auch die Nummern bei den Referenzen in anderen Tabellen setzt.

Als alternative müsste ich die Beziehungen zwischen den Tabellen trennen, den Kunden separat abspeichern, und dann erneut laden und die nummer verwenden um die adressen abzuspeichern... Da klingt nach sehr viel Aufwand, wenn es auch wesentlich einfacher gehen könnte... Ausserdem wäre es so sehr sehr unsauber.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Mar 15, 2007 8:44 pm 
Beginner
Beginner

Joined: Sat Dec 09, 2006 12:02 pm
Posts: 26
Hat zu diesem Problem niemand eine Idee??? Ich kann doch nicht der erste sein, der dieses Problem hat.. Oder???

Hat hier irgendjemand schonmal seine hbm.xml-Dateien so konfiguriert, dass er die Fremdschlüsselbeziehungen nutzen konnte???


Top
 Profile  
 
 Post subject:
PostPosted: Fri Mar 16, 2007 6:10 am 
Regular
Regular

Joined: Fri May 12, 2006 4:05 am
Posts: 106
An sich müsste das schon funktionieren. Vielleicht postest Du mal Deine Mappings, da sollte man das Problem genauer erkennen können.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Mar 16, 2007 8:06 am 
Beginner
Beginner

Joined: Sat Dec 09, 2006 12:02 pm
Posts: 26
Oh ja, natürlich.. Gute Idee, hätt ich ja fast mal selbst drauf kommen können.

Also.

Als erstes meine Customer-Tabelle (Customer.hbm.xml
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
   
<hibernate-mapping>
<!--
    Created by the Middlegen Hibernate plugin 2.1

    http://boss.bekk.no/boss/middlegen/
    http://www.hibernate.org/
-->

<class
    name="de.nfranze.sf.model.Customer"
    table="customer"
>

    <id
        name="id"
        type="java.lang.Integer"
        column="id"
    >
        <generator class="native" />
    </id>

    <property
        name="state"
        type="short"
        column="state"
        not-null="true"
        length="10"
    />
    <property
        name="nick"
        type="java.lang.String"
        column="nick"
        not-null="true"
        length="40"
    />
    <property
        name="name"
        type="java.lang.String"
        column="name"
        not-null="true"
        length="50"
    />
    <property
        name="firstname"
        type="java.lang.String"
        column="firstname"
        not-null="true"
        length="40"
    />
    <property
        name="birthdate"
        type="java.sql.Date"
        column="birthdate"
        length="10"
    />

    <!-- Associations -->
 
    <!-- bi-directional one-to-one association to Custcontact -->
    <one-to-one
        name="custcontact"
        class="de.nfranze.sf.model.Custcontact"
        outer-join="auto"
        constrained="true"
    />

</class>
</hibernate-mapping>


Und nun die Custcontact.hbm.xml, welche die Kontaktdaten zu diesem Kontakt enthält.
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 2.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd" >
   
<hibernate-mapping>
<!--
    Created by the Middlegen Hibernate plugin 2.1

    http://boss.bekk.no/boss/middlegen/
    http://www.hibernate.org/
-->

<class
    name="de.nfranze.sf.model.Custcontact"
    table="custcontact"
>

    <id
        name="customerid"
        type="java.lang.Integer"
        column="customerid"
    >
        <generator class="native" />
    </id>

    <property
        name="phone"
        type="java.lang.String"
        column="phone"
        length="40"
    />
    <property
        name="fax"
        type="java.lang.String"
        column="fax"
        length="40"
    />
    <property
        name="mail"
        type="java.lang.String"
        column="mail"
        length="40"
    />
    <property
        name="mobile"
        type="java.lang.String"
        column="mobile"
        not-null="true"
        length="45"
    />

    <!-- Associations -->
 
    <!-- bi-directional one-to-one association to Customer -->
    <one-to-one
        name="customer"
        class="de.nfranze.sf.model.Customer"
        outer-join="auto"
    />

</class>
</hibernate-mapping>


Wobei mir auffällt.. Wo steht denn eigentlich, über welche Spalten die Schlüssel verbunden sind?

Ich generiere alle meine Dateien mit Ant. Hier mal der Auszug meiner Build.xml, welcher diese hbms generiert.

Code:
   <target name="Generate Database Objects" description="Middlegen hbm-Generation from MySQL">
      <taskdef name="middlegen" classname="middlegen.MiddlegenTask">
         <classpath refid="master-classpath"/>
      </taskdef>

      <taskdef name="hibernatetool" classname="org.hibernate.tool.ant.HibernateToolTask">
         <classpath refid="master-classpath"/>
      </taskdef>

      <middlegen
          appname="Sf"
          gui="false"
          databaseurl="jdbc:mysql://fileserver/sf"
          driver="com.mysql.jdbc.Driver"
          username="root"
          password="blabla"
          schema="sf"
          includeViews="false"
         >
         <hibernate
               destination="${web.dir}/src"
               package="de.nfranze.sf.model"
               standardGeneratorScheme="native"
               javaTypeMapper="middlegen.plugins.hibernate.HibernateJavaTypeMapper"/>
      </middlegen>

      <hibernatetool destdir="${web.dir}/src">
         <configuration>
            <fileset dir="${model.dir}">
               <include name="**/*.hbm.xml"/>
            </fileset>
         </configuration>
         <classpath refid="master-classpath"/>
         
         <hbm2java jdk5="true"/>
      </hibernatetool>
   </target>


Es wäre schön, wenn die Dateien gleich richtig generiert werden würden.[/code]


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.