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