2010-11-21 10 views
0

Ich habe folgende Situation:Wie man abgeleitete Identitäten in Hibernate 3 abbildet?

@Entity 
class A{ 
    @Id 
    @SequenceGenerator(name = "SEQ_AID", sequenceName = "SEQ_AID") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_AID") 
    private Long aId; 
    @OneToOne(fetch=FecthType.LAZY,optional=false,cascade=CascadeType.ALL) 
    private B b; 
    ... 
} 
@Entity 
class B{ 
    @Id 
    private A a; 
    ... 
} 

Mit anderen Worten: Es gibt einen Zusammenhang zwischen OneToOne A und B. B eine schwache Person ist, und seine Id aus der Klasse A.

I‘abgeleitet ist, Ich habe bereits einige Lösungen getestet, die @PrimaryKeyJoinColumn unter @OneToOne hinzufügen, wie dies article erwähnt. Aber ich habe diesen Fehler: "org.hibernate.id.IdentifierGenerationException: IDs für diese Klasse muss manuell vor dem Aufruf von save() zugewiesen werden: B"
Ich weiß nicht, ob es in diesem Fall relevant ist, aber ich verwende Oracle 11g.

AKTUALISIERT

Ich glaube, ich in der richtigen Art und Weise bin. Hier ist der Ist-Zustand meines Problems:

@Entity 
class A{ 
    @Id 
    @SequenceGenerator(name = "SEQ_AID", sequenceName = "SEQ_AID") 
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_AID") 
    private Long aId; 
    @OneToOne(fetch=FecthType.LAZY,optional=false,cascade=CascadeType.ALL) 
    @PrimaryKeyJoinColumn(name="aId") 
    private B b; 
    ... 
} 
@Entity 
class B{ 
    @Id 
    @OneToOne 
    @JoinColumn(name="aId) 
    private A a; 
    ... 
} 

Der Fehler ist jetzt ein bisschen anders:

java.sql.SQLException: ORA-00904: "B"."A": invalid identifier 

Es wird versucht, die Spalte A (statt AID) in der Tabelle B zu finden I Ich weiß nicht, wie ich angeben soll, dass der Spaltenname B.AID und nicht BA ist

+0

Wenn Sie Hibernate 3.5, das helfen kann: http://stackoverflow.com/questions/ 4027623/how-do-i-richtig-Kaskaden-speichern-ein-zu-eins-bidirektionale Beziehung-auf-Primar – axtavt

Antwort

1

ich mein Problem gelöst nach diesem link

Die richtige Antwort wäre:

@Entity 
public class A { 

    @Id 
    @GeneratedValue 
    @Column(name = "aId") 
    private Long id; 

    @OneToOne(fetch = FetchType.LAZY, optional=false, cascade = CascadeType.ALL, mappedBy = "a") 
    private B b; 
    ... 
} 


@Entity 
@org.hibernate.annotations.GenericGenerator(name="a-primarykey", strategy="foreign", parameters={@org.hibernate.annotations.Parameter(name="property", value="a")}) 
public class B { 

    @Id 
    @GeneratedValue(generator = "a-primarykey") 
    @Column(name = "aId") 
    private Long id; 

    @OneToOne 
    @PrimaryKeyJoinColumn 
    private A a; 
    ... 
} 
1

Haben Sie dies auf Entität B versucht?

@Entity class B { 
    @Id @OneToOne 
    @JoinColumn(name = "table_a_id") //put the correct column name for A's pk here 
    private A a; 
    .... 
} 
+0

ja. Danke für die Antwort, aber es funktioniert nicht, der gleiche Fehler. Wie der Artikel sagt, scheint es, dass es nicht möglich ist, eine Kaskade mit abgeleiteten Identitäten zu verwenden ... – Neuquino