Wie abzubilden abgeleitete Identitäten in Hibernate 3?
-
26-09-2019 - |
Frage
Ich habe die folgende Situation vor:
@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 eine OneToOne Assoziation zwischen A und B. B eine schwache Einheit ist, und seine Id aus der Klasse A abgeleitet ist
Ich habe bereits einige Lösungen wie das Hinzufügen @PrimaryKeyJoinColumn unter @OneToOne wie diese Artikel 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 bin mit 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. Ich weiß nicht, zu finden, wie Sie angeben, dass der Spaltenname B.AID und nicht B.A.
Lösung
löste ich mein Problem 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;
...
}
Andere Tipps
Haben Sie versucht, diese auf Entity B?
@Entity class B {
@Id @OneToOne
@JoinColumn(name = "table_a_id") //put the correct column name for A's pk here
private A a;
....
}