2010-11-21 21 views
0

je la situation suivante:Comment mapper des identités dérivées dans hibernate 3?

@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 existe une association OneToOne entre A et B. B est une entité faible, et son identifiant est dérivé de la classe A.

Je Nous avons déjà testé certaines solutions en ajoutant @PrimaryKeyJoinColumn sous @OneToOne comme dans les mentions article. Mais j'ai eu cette erreur: "org.hibernate.id.IdentifierGenerationException: les identifiants de cette classe doivent être assignés manuellement avant d'appeler save(): B"
Je ne sais pas si c'est pertinent 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 tente de trouver la colonne A (au lieu de l'AID) dans le tableau B. I ne sais pas comment spécifier que le nom de la colonne est B.AID et non BA

+0

Si vous utilisez Hibernate 3.5, cela peut aider: http://stackoverflow.com/questions/ 4027623/how-do-i-correctement-cascade-save-a-one-to-one-bidirectionnel-relationship-on-primar – axtavt

Répondre

1

Je résolu mon problème suivant cette link

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

Avez-vous essayé ceci sur 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; 
    .... 
} 
+0

oui. Merci pour la réponse, mais ça ne marche pas, même erreur. Comme le dit l'article, il semble qu'il ne soit pas possible d'utiliser la cascade avec des identités dérivées ... – Neuquino