Comment cartographier les identités dérivées en veille prolongée 3?
-
26-09-2019 - |
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.
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;
....
}