Alex2222 wrote:
Hallo!
Ich habe eine Tabelle mit einem zusammengesetzten Fremdschlüssel. Da in einer anderen Tabelle nur auf einen des Schlüssels referenziere, habe ich nur diesen als Primarykey angegeben und den anderen Teil als einfache Property.
Wenn ich jetzt auf den einen Teil des Primärschlüssels abfrage:
getSession().createQuery("FROM Aktion WHERE AktionPK1="+ aktionPK1)
bekomme ich zwar zwei Objekte zurück (richtigerweise), aber zweimal das selbe.
Nach Debugging bin ich jetzt zu dem Ergebnis gekommen, dass Hibernate die Objekte korrekterweise anhand der PK identifiziert.
Weiß jemand eine Lösung für mein Problem?
Alex.
Hallo Alex,
hast du schon einmal etwas von einer Id-Klasse gehört? Wenn nicht hier ein paar Tips:
1.) die Id-Klasse (z.B. PersonId) muss mit @Embeddable annotiert werden und
2.) java.io.Serializable als Interface implementieren.
3.) Die getter-Funktionen müssen genauso annotiert werden wie bisher.
Deine bisher verwendete Klasse musst du wie folgt erweitern:
@Entity(access = AccessType.PROPERTY)
@Table(name = "db_tabelle", schema = "schema_name")
public class Person implements Serializable
{
private PersonId id;
// Constructors
/** default constructor */
public Person()
{
}
/** minimal constructor */
public Person(PersonId id)
{
this.id = id;
}
/** full constructor */
public Person(PersonId id, Integer pkColumn1, String pkColumn2)
{
this.id = id;
this.pkColumn1 = pkColumn1;
this.pkColumn2 = pkColumn2;
}
// Property accessors
@EmbeddedId
@AttributeOverrides( {
@AttributeOverride(name="myDB_pk_column1", column=@Column(name="myDB_pk_column1", unique=false, nullable=false, insertable=true, updatable=true) ),
@AttributeOverride(name="myDB_pk_column2", column=@Column(name="myDB_pk_column1", unique=false, nullable=false, insertable=true, updatable=true, length=1) ) } )
public PersonId getId() {
return this.id;
}
public void setId(PersonId id) {
this.id = id;
}
// weiter mit den üblichen Annotationen
}
Zusätzlich musst du die bisherigen setter/getter auskommentieren, die du jetzt in deiner Id-Klasse verwendest.
Zusätzlich solltest du deine Parameter anders verwenden:
Quote:
WHERE AktionPK1="+ aktionPK1
Code:
Query query = getSession.createQuery("FROM Person p WHERE p.Id.pkColumn1 = :myParam");
query.setParameter("myParam", anyParam);
Hoffentlich hilft dir das weiter.
MfG,
Alex
**********************
credits nicht vergessen ;-)