2009-06-07 9 views
14

Die folgende nicht funktioniert:Hibernate: Wird mappedBy für eine Klasse verwendet, die eine andere Klasse erweitert, die mit JoinedSubclass gekennzeichnet ist?

@Entity 
class Owner { 

    @OneToMany(mappedBy="owner", cascade = {CascadeType.ALL}) 
    protected Set<B> getBSet() { 
    .. 
    } 

} 

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
class A { 
    @ManyToOne 
    public Owner getOwner() { 
    ... 
    } 
} 

@Entity 
class B extends A { 

} 

Es verursacht eine Ausnahme als solche: org.hibernate.AnnotationException: mappedBy Referenz eine unbekannte Zieleinheit Eigenschaft: B.user in Besitzer.

Ich versuche zu vermeiden, die "Eigentümer" -Eigenschaft in Klasse B (die "denormalize" und kopiert den Besitzerschlüssel in beide Tabellen für Entität A und B generiert) zu kopieren. Außerdem würde ich wirklich gerne A und B in einer separaten Tabelle haben und keinen Diskriminator verwenden, indem ich SingleTable-Vererbung verwende.

Ich kann auch nicht herausfinden, wie man etwas Ähnliches macht, indem man @OneToOne zwischen A und B benutzt (und nicht B extend A).

Antwort

0

Ich würde überprüfen Sie Ihre tatsächliche Umsetzung. Ich habe Ihren Beispielcode verwendet und nach dem Hinzufügen einer @Id hat alles wie erwartet funktioniert. Sogar IntelliJ sagt, dass getBSet() mit B.owner assoziiert ist.

+0

Haben Sie es tatsächlich ausgeführt und die Session Factory erstellt? Danke - ich überprüfe es. Ich habe diesen exakt gleichen Code nicht verwendet - ich habe gerade von einem realen Beispiel genommen, das ich hatte, das die gleiche Art von Sache tut ... – GreenieMeanie

+0

Ja, ich habe es ausgeführt. Deshalb habe ich die @ ID erwähnt. Die SF beschwerte sich darüber, dass die @id fehlte. Danach baute der SF in Ordnung. Ich hätte schwören können, dass ich genau diesen Satz eingegeben habe, hah! Viel Glück! – danieljimenez

6

Versuchen Sie, targetEntity = Transaction.class hinzuzufügen. Dies funktionierte für mich, als ich SINGLE_TABLE Vererbung verwendete. Ich habe es nicht mit JOIN versucht.

@Entity 
class Owner { 

    @OneToMany(mappedBy="owner", cascade = {CascadeType.ALL}, targetEntity = Transaction.class) 
    @Where(clause = "tableType='I'") 
    protected Set<B> getBSet() { 
    .. 
    } 

} 
+0

Funktioniert auch für mich (ich benutze 'InheritanceType.TABLE_PER_CLASS') – Numbernick

10

Es ist eine Hibernate Kuriosität, aber es ist absichtlich. Ich habe eine blog post mit Hintergrundinformationen, Links und eine Umgehungsmöglichkeit für die JOINED-Lösung.

Verwandte Themen