-->
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.  [ 7 posts ] 
Author Message
 Post subject: Probleme mit Foreign Key bei Insert
PostPosted: Wed Sep 21, 2005 10:24 am 
Regular
Regular

Joined: Sat Sep 03, 2005 9:07 am
Posts: 87
Location: Graz, AUSTRIA
Ich möchte mittels Hibernate ein Insert Statement machen.
Dazu rufe ich auf einem CommandButton eine Methode auf, die wiederum eine andere Methode aufruft und dieser bestimmte Parameter übergibt.
Ich muss in diese Tabelle unter anderem eine Foreign Key ID schreiben. Leider check ich ned ganz wie das funktioniert, da ich beim setzen dieser ID die gesamte Klasse übergeben muss und ich nun nicht weiß, wie ich die ID daraus bekomme.

Hier das Beispiel, weil ich kanns ned genau erklären:
Code:
   public void InsertGateway(String gwName,Long aid, String ssid, String sfid, String pwd, String mandssid, String mandsfid, String mandpwd, Long checknumber, Long calluserdata) throws Exception {

      Session session = HibernateUtil.currentSession();
      Transaction tx = null;
      try {
         tx = session.beginTransaction();
         EtGateway etgateway = new EtGateway();
         etgateway.setGwName(gwName);
         etgateway.setaId() --->WAS ÜBERGEBE ICH HIER -->ER will dass ich ihm einen Wert der Klasse EtAccessMethod übergebe, ich muss hier allerdings eine ID in die Datenbank schreiben. WIe mache ich das.
         etgateway.setSsid(ssid);
         etgateway.setSfid(sfid);
         etgateway.setPwd(pwd);
         etgateway.setMandSsid(mandssid);
         etgateway.setMandSfid(mandsfid);
         etgateway.setMandPwd(mandpwd);
         etgateway.setCheckNumber(checknumber);
         etgateway.setCalluserdata(calluserdata);
         session.saveOrUpdate(etgateway);

         tx.commit();

      }
      catch (Exception ex) {
         if (tx != null)
            tx.rollback();
         msg = bundle.getString("errorInsertGateway");
         context.addMessage(null, new FacesMessage(
               FacesMessage.SEVERITY_WARN, msg, null));
         throw ex;
      }
      finally {
         HibernateUtil.closeSession();
      }

   }



Ist es verständlich was ich meine?

Hier noch mein Hibernate Mapping File für diese Entity:
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">

<hibernate-mapping schema="EDITOOLS" package="com.magnasteyr.editool.hibernate">
  <class name="EtGateway" dynamic-update="true" dynamic-insert="true" lazy="false" table="ET_GATEWAY">
    <id name="gwId" type="long" unsaved-value="null">
      <column name="GW_ID" not-null="true" sql-type="NUMBER"/>
      <generator class="sequence"/>
    </id>
    <property name="gwName" type="string">
      <column name="GW_NAME" not-null="true" sql-type="VARCHAR2"/>
    </property>
    <property name="ssid" type="string">
      <column name="SSID" sql-type="VARCHAR2"/>
    </property>
    <property name="sfid" type="string">
      <column name="SFID" sql-type="VARCHAR2"/>
    </property>
    <property name="pwd" type="string">
      <column name="PWD" sql-type="VARCHAR2"/>
    </property>
    <property name="mandSsid" type="string">
      <column name="MAND_SSID" sql-type="VARCHAR2"/>
    </property>
    <property name="mandSfid" type="string">
      <column name="MAND_SFID" sql-type="VARCHAR2"/>
    </property>
    <property name="mandPwd" type="string">
      <column name="MAND_PWD" sql-type="VARCHAR2"/>
    </property>
    <property name="phonenumber" type="string">
      <column name="PHONENUMBER" sql-type="VARCHAR2"/>
    </property>
    <property name="ip" type="string">
      <column name="IP" sql-type="VARCHAR2"/>
    </property>
    <property name="checkNumber" type="long">
      <column name="CHECK_NUMBER" sql-type="NUMBER"/>
    </property>
    <property name="calluserdata" type="long">
      <column name="CALLUSERDATA" sql-type="NUMBER"/>
    </property>
    <many-to-one name="aId" entity-name="com.magnasteyr.editool.hibernate.EtAccessMethod" cascade="save-update" foreign-key="SYS_C0062977">
      <column name="A_ID" not-null="true" sql-type="NUMBER"/>
    </many-to-one>
    <many-to-one name="rId" entity-name="com.magnasteyr.editool.hibernate.EtRouter" cascade="save-update" foreign-key="SYS_C0062978">
      <column name="R_ID" not-null="true" sql-type="NUMBER"/>
    </many-to-one>
    <bag name="etEdiPartner" lazy="true" inverse="true" cascade="none">
      <key foreign-key="SYS_C0062976">
        <column name="GW_ID" not-null="true" sql-type="NUMBER"/>
      </key>
      <one-to-many entity-name="com.magnasteyr.editool.hibernate.EtEdiPartner"/>
    </bag>
  </class>
</hibernate-mapping>


THX


Top
 Profile  
 
 Post subject:
PostPosted: Wed Sep 21, 2005 1:05 pm 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
Semmerl wrote:
Code:
etgateway.setaId() --->WAS ÜBERGEBE ICH HIER -->ER will dass ich ihm einen Wert der Klasse EtAccessMethod übergebe, ich muss hier allerdings eine ID in die Datenbank schreiben. WIe mache ich das.


Ich würde folgendes vorschlagen:
Code:
EtAccessMethod method = session.get(EtAccessMethod.class, aid);
etgateway.setaId(method);


Ich habe manchmal auch
Code:
EtAccessMethod method = new EtAccessMethod();
method.setaId(aid);
etgateway.setaId(method);

in Tests geschrieben, denke aber, dass es im Allgemeinen "gefährlich" ist - falls das EtAccessMethod Objekt mit Id aid bereits in der Session existiert, endet das mit einer Exception, wenn ich mich recht erinnere.

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Wed Sep 21, 2005 3:56 pm 
Regular
Regular

Joined: Sat Sep 03, 2005 9:07 am
Posts: 87
Location: Graz, AUSTRIA
ErikFK wrote:
Ich würde folgendes vorschlagen:
Code:
EtAccessMethod method = session.get(EtAccessMethod.class, aid);
etgateway.setaId(method);




ALso i weiß ned, ob mir das hilft.
Ich habe wie gesagt eine Form, wo verschiedene Inputboxen sowie SelectItems vorhanden sind. Der User macht ein paar Eingaben und wählt diverse Sachen in den Selectboxen aus und drückt dann auf speichern und die Methode wie oben wird aufgerufen.
Diese AID ist der KeyWert einer SelectItem Komponente.
Welche AID wird nach deiner vorgeschlagene Methode nun an die Methode setaId übergeben? Das verstehe ich ned ganz.


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 22, 2005 12:43 am 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
Semmerl wrote:
Welche AID wird nach deiner vorgeschlagene Methode nun an die Methode setaId übergeben? Das verstehe ich ned ganz.

Nun, ich habe wahrscheinlich einen überhasteten Schluss gezogen, als ich aid gesehen und gedacht habe, dass es wohl der Primärschlüssel von einem EtAccessMethod Eintrag ist.

Allerdings muss ich jetzt zugeben, dass ich nicht verstehe, was du genau erreichen willst. Denn, um eine EtAccessMethod mit dem neuen EtGateway verknüpfen zu können, brauchst du entweder das Objekt selber oder zumindest seine Id. Woher du das eine oder andere bekommen kannst, kann ich dir, mit den Informationen, die du bisher gegeben hast, nicht sagen.

Von dem, was du in der geposteten Methode geschickt hast, verstanden habe, würde ich erwarten, dass der Benutzer irgendwie (unter anderem) an der Oberfläche eine Liste von Methoden angezeigt bekommt, eine auswählen kann, und weiters die Daten für einen neuen Gateway erfassen kann, die mit der gewählten Methode verknüpft werden soll.

Mit diesem (anscheinend falschen) Bild deines Anwendungsfalls dachte ich, dass die aid eben der Primärschlüssel von einem EtAccessMethod Eintrag ist.

Ich weiß jetzt nicht, wo ich falsch liege, aber ohne Id eines EtAccessMethod, ist kein setaId() Aufruf sinnvoll (außer mit null, aber das ist ja nicht zulässig)). Ich sehe übrigens, dass dasselbe auch für rId und EtRouter gilt.

Daher bitte um ergänzende Infos, damit ich weiterhelfen kann.

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 22, 2005 2:56 am 
Regular
Regular

Joined: Sat Sep 03, 2005 9:07 am
Posts: 87
Location: Graz, AUSTRIA
Die Aid is mein Primary Key der Tabelle ETAccessMethod

Funktioniert das dann so, dass eine ID eingetragen wird wenn ich folgenden Code verwende:

Code:
EtAccessMethod method = (EtAccessMethod)session.get(EtAccessMethod.class, aid);
         etgateway.setaId(method);


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 22, 2005 2:58 am 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
Semmerl wrote:
Die Aid is mein Primary Key der Tabelle ETAccessMethod

Funktioniert das dann so, dass eine ID eingetragen wird wenn ich folgenden Code verwende:

Code:
EtAccessMethod method = (EtAccessMethod)session.get(EtAccessMethod.class, aid);
etgateway.setaId(method);

Würde ich sehr hoffen :-)

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 22, 2005 4:24 am 
Regular
Regular

Joined: Sat Sep 03, 2005 9:07 am
Posts: 87
Location: Graz, AUSTRIA
Passt alles, funktioniert, danke, bekommst einen Credit ;-)


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 7 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.