-->
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: Vererbung und konkrete Assoziation
PostPosted: Thu Mar 27, 2008 9:14 pm 
Newbie

Joined: Thu Mar 27, 2008 8:43 pm
Posts: 5
Hallo,

ich habe eine einfache Vererbung "Tabelle pro Klassenhierarchie".
Polymorphe Assoziation funktioniert mit der eingesetzten Version 3.2.1.

Ich finde jedoch kein Beispiel und habe Idee, wie man konkret
assoziiert. Also, z.B. bei dem viel gebrachten Kontobeispiel. Der Bankkunde
soll jetzt bei mir eine direkte Assoziation zu den Kreditkartenkonto haben.

Also für das Mapping der User-Klasse zu den Kreditkarten

Code:
@OneToMany(targetEntity = Creditcard.class, mappedBy = "user", cascade = CascadeType.ALL)
    @org.hibernate.annotations.Cascade({
            org.hibernate.annotations.CascadeType.SAVE_UPDATE,
            org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
  public Set<InputParametervalue> getCreditcards() {
    return this.creditcards;
  }


Die userid ist in der abstrakten Basisklasse BillingDetails.

So gemappt. scheißt Hibernate die Fehlermeldung,

Code:
Caused by: org.hibernate.AnnotationException: mappedBy reference an unknown target entity property: Creditcard.user in User.creditcards


Wenn ich für targetEntity die Basisklasse, also BillingDetails einsetze, kommt es zu einer Class Cast Exception, von BankAccount auf CreditCard. Warum ist mir klar, wenn ich mir die Query anschaue: Der Diskriminator tauch in der where-Bedingung nicht auf und enthält nur die userId. So werden alle BillingDetails für den User geladen und die entsprechenden Objekte richtig instanziert.

Ich studiere Hibernat erst seit ein paar Tagen. Vielleicht mache ich es
komplizierter als es sein muß.

Vielen Dank für Tipps.
Grüße
Torsten


Top
 Profile  
 
 Post subject:
PostPosted: Fri Mar 28, 2008 4:17 am 
Expert
Expert

Joined: Thu Jul 05, 2007 9:38 am
Posts: 287
Das sollte aber eigentlich funktionieren, wie sieht denn dein Mapping der CreditCard Klasse aus? Kannst du CreditCard Objekte speichern und laden?

_________________
Please rate useful posts.


Schauderhaft: Softwaredevelopment, Projectmanagement, Qualitymanagement and all things "schauderhaft"


Top
 Profile  
 
 Post subject:
PostPosted: Fri Mar 28, 2008 9:00 am 
Newbie

Joined: Thu Mar 27, 2008 8:43 pm
Posts: 5
schauder wrote:
Das sollte aber eigentlich funktionieren, wie sieht denn dein Mapping der CreditCard Klasse aus? Kannst du CreditCard Objekte speichern und laden?


Einfügen, Updaten, Löschen, Laden für CreditCard-Objekte funktioniert.
Das Mapping von CreditCard sieht so aus:

Code:
@Entity
@DiscriminatorValue(value="2")
public class CreditCard extends BillingDetails implements Serializable {
}


========================

Code:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
    name = "BILLINGTYPE",
    discriminatorType = DiscriminatorType.INTEGER
)
@Table(name = "T_BILLINGDETAILS", uniqueConstraints = {})
public abstract class BillingDetails {

@ManyToOne(targetEntity = User.class)
  @JoinColumn(name = "USERID", referencedColumnName = "USERID", unique = false, nullable = false, insertable = true, updatable = false)
  public User getUser() {
    return this.user;
  }
...
}


Ich habe das für mich jetzt erst einmal so gelöst, daß
über eine @Where - Annotation der Discriminator hinzufügt wird.
Trotzdem muß es einen Grund geben, warum hibernate nicht
von selbst den Discriminator hinzufügt.
Führe ich eine Query über CreditCard durch, sieht das SQL-Select
wie gewünscht aus, nämlich mit dem Discriminator-Wert in der
where-Bedingung. Also, aus
Code:
select c from CreditCard c 


wird:
Code:
select * from BillingDetails where BILLINGTYPE = 2


Also, es bleibt für mich unklar, warum hibernate bei der Auflösung der
1:n Assoziation auf eine konkrete Klasse nicht den Discriminator mit einbezieht......


Top
 Profile  
 
 Post subject:
PostPosted: Fri Mar 28, 2008 10:10 am 
Expert
Expert

Joined: Thu Jul 05, 2007 9:38 am
Posts: 287
Ich habe mir gerade die Fehlermeldung noch mal etwas genauer angeschaut, und ich denke ich hab das Problem entdeckt.

Du hast ein bidirektionale Beziehung defininiert, wobei die eine Richtung
vom User zur Creditcard geht,
die andere Richtung aber von BillingDetails auf User.

Das passt nicht wirklich zusammen.

_________________
Please rate useful posts.


Schauderhaft: Softwaredevelopment, Projectmanagement, Qualitymanagement and all things "schauderhaft"


Top
 Profile  
 
 Post subject:
PostPosted: Fri Mar 28, 2008 10:29 am 
Newbie

Joined: Thu Mar 27, 2008 8:43 pm
Posts: 5
Ja, aber so verstehe ich vererbung. Die Beziehung zum User ist in der Basisklasse. In den Unterklassen darf das meiner Ansicht nach nicht
überschrieben werden. Wenn doch, kann das mapping-framework von
einer Exklusivität dieses Feldes ausgehen und benötigt den
Diskriminator beim Fetchen nicht.

Ich denke, ein solches Mapping könnte funktionieren: Durch
Reflexion ist die Zielklasse erkennbar und damit auch im Mapping
die Vererbungshierachie auswertbar.


Top
 Profile  
 
 Post subject:
PostPosted: Sat Mar 29, 2008 6:59 pm 
Expert
Expert

Joined: Thu Jul 05, 2007 9:38 am
Posts: 287
Ich kann mir nicht vorstellen, das Hibernate mit einem Bidirektionalen Mapping klar kommt dessen hin und Rückrichtungen nicht equivalent sind.

Eine Referenz auf eine konkrete Subklasse funktioniert aber problemlos

_________________
Please rate useful posts.


Schauderhaft: Softwaredevelopment, Projectmanagement, Qualitymanagement and all things "schauderhaft"


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.