-->
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.  [ 3 posts ] 
Author Message
 Post subject: Query mit Composite Key (Objekt) als Kriterium?
PostPosted: Thu Sep 08, 2005 5:12 am 
Newbie

Joined: Thu Sep 08, 2005 4:53 am
Posts: 7
Location: Cologne, Germany
Hallo!

Ich arbeite gerade an meiner ersten Anwendung mit Hibernate und bislang hat auch alles soweit ganz gut funktioniert, allerdings stehe ich nun vor einem Problem:

In meinem Datenmodell gibt es eine Tabelle mit zusammengesetztem Schlüssel, auf die ich auch gerne über Hibernate zugreifen würde. Das Mapping habe ich auch relativ schnell durchschaut, die Klasse "CrHistorie" soll wie folgt gemappt werden:

Code:
<hibernate-mapping package="my.CR">

    <class name="CrHistorie" table="CR_HISTORIE">
       <composite-id name="id" class="CrHistorie_Key">
           <key-many-to-one name="id" class="ChangeRequest" column="CR_ID"/>
           <key-many-to-one name="status" class="CrStatus" column="STATUS"/>
           <key-many-to-one name="bearbeiter" class="CrUser" column="BEARBEITER"/>
           <key-property name="datum" type="date" column="DATUM"/>
       </composite-id>
      
       <property name="kommentar" column="KOMMENTAR" type="string"  />      
    </class>
   
</hibernate-mapping>


Ich habe dazu auch eine entsprechende Klasse geschrieben, die den Key represäntiert ("CrHistorie_Key") und die vier Attribute enthält. Die Klasse wurde mit den Methoden .equals() und .HashSet() ausgestatt und ist serializable.
Ich denke also, dass ich hier alles richtig gemacht habe:

Code:
package my.CR;

import java.io.Serializable;

public class CrHistorie_Key implements Serializable {
   
   private int Id;
   private CrUser Bearbeiter;
   private CrStatus Status;
   private java.util.Date Datum;
   
/*   Konstruktor                        */
   public CrHistorie_Key() { }
   public CrHistorie_Key(int _id) {
      Id       = _id;
      Datum    = new java.util.Date();
   }
   public CrHistorie_Key(CrHistorie_Key _key) {
      Id          = _key.getId();
      Bearbeiter    = _key.getBearbeiter();
      Status       = _key.getStatus();
      Datum       = _key.getDatum();
   }
   
/*   Getter und Setter                  */
   public int getId()             {   return Id;         }
   public void setId(int _id)      {   Id = _id;         }
   
   public CrUser getBearbeiter()   {   return Bearbeiter;   }
   public void setBearbeiter(CrUser _bearb)
                           {   Bearbeiter = _bearb;}
   
   public CrStatus getStatus()      {   return Status;      }
   public void setStatus(CrStatus _stat)
                           {   Status = _stat;      }
   
   public java.util.Date getDatum(){   return Datum;      }
   public void setDatum(java.util.Date _datum)
                           {   Datum = _datum;      }


/*   Weitere Methoden                  */
   public boolean equals(Object other) {
      if (this == other) return true;
      if ( !(other instanceof CrHistorie_Key) )
         return false;
      final CrHistorie_Key key = (CrHistorie_Key) other;
      if ( !(key.getId() == this.getId()) )
         return false;
      if ( !key.getBearbeiter().equals(this.getBearbeiter()) )
         return false;
      if ( !key.getStatus().equals(this.getStatus()) )
         return false;
      if ( !key.getDatum().equals(this.getDatum()) )
         return false;
      return true;
   }
   
      public int hashCode() {
      int result;
      result = this.getBearbeiter().hashCode();
      result = 29 * result + this.getId();
      return result;
      }
}


Nun stellt sich mir aber die Frage, wie ich eine Abfrage mit session.createQuery() ausführen kann und dabei den Composite Key als Einschränkungskriterium anwenden kann.
Bei einfachem Integer als Primärschlüssel würde ich etwas basteln wie:
Code:
session.createQuery("from CrHistorie where id = " + this.Id);


Aber wie binde ich hier das Objekt CrHistorie_Key als Kriterium ein?


MfG


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 08, 2005 5:26 am 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
Hallo,

Statt
Code:
session.createQuery("from CrHistorie where id = " + this.Id);

solltest du es mit
Code:
session.get(<Klasse>.class, <eine CrHistorie_Key Instanz>);

probieren (statt <Klasse> gibst die Klasse an, deren Primärschlüssel CrHistorie_key ist und <eine CrHistorie_Key Instanz> wird durch ein entsprechendes CrHistorie_Key ersetzt.

Ich hoffe, es hilft fürs Erste.

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 08, 2005 7:28 am 
Newbie

Joined: Thu Sep 08, 2005 4:53 am
Posts: 7
Location: Cologne, Germany
Danke Dir!

Hatte noch einen Fehler im Mapping, weil ich in der KEY-Klasse die ID als Integer und nicht als Klasse eines anderen benötigten Typs drin hatte, aber jetzt funktioniert es!


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