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.

War es hilfreich?

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;
  ....
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top