Question

J'ai la situation suivante:

@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;
  ...
}

En d'autres termes:. Il y a une association OneToOne entre A et B. B est une entité faible, et son identifiant est dérivé de la classe A

Je l'ai déjà testé quelques solutions que l'ajout @PrimaryKeyJoinColumn sous @OneToOne que ce article mentionne. Mais je suis arrivé cette erreur: « org.hibernate.id.IdentifierGenerationException: ids pour cette classe doivent être affectés manuellement avant d'appeler save (): B »
Je ne sais pas si elle est pertinente dans ce cas, mais j'utilise Oracle 11g.

MISE À JOUR

Je pense que je suis dans le droit chemin. Voici l'état actuel de mon problème:

@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;
  ...
}

L'erreur est maintenant un peu différent:

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

Il essaie de trouver la colonne A (au lieu de l'AID) dans le tableau B. Je ne sais pas comment spécifier que le nom de la colonne est B.AID et non B.A.

Était-ce utile?

La solution

Je résolu mon problème suivant ce lien

La réponse correcte serait:

@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;
  ...
} 

Autres conseils

Avez-vous essayé cette entité sur B?

@Entity class B {
  @Id @OneToOne 
  @JoinColumn(name = "table_a_id") //put the correct column name for A's pk here
  private A a;
  ....
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top