2010-08-13 20 views
3

J'ai des problèmes avec les annotations @OneToMany et @ManyToOne.Problèmes d'annotations Hibernate, Persistence et @OneToMany et @ManyToOne

J'ai deux suites Suite et SuiteVersion. Une SuiteVersion dépend d'une suite. J'ai donc mis en œuvre dans mon code:

Classe Suite:

@OneToMany(mappedBy = "suite") 
@Cascade(CascadeType.DELETE_ORPHAN) 
private List<SuiteVersion> listSuiteVersion = new ArrayList<SuiteVersion>(); 

Classe SuiteVersion:

@ManyToOne() 
@Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE}) 
private Suite suite; 

Mais j'ai un problème quand je supprimer une suite dont ont SuiteVersion associé. Mise en veille prolongée ne supprime pas SuiteVersion avant Suite.I ne sais pas pourquoi parce que je l'ai mentionné dans mon code:

@Cascade(CascadeType.DELETE_ORPHAN) 

Ce journal i obtenu lorsque je supprime suite:

Hibernate: delete from SUITE where ID_SUITE=? 13 août 2010 09:40:50 org.hibernate.util.JDBCExceptionReporter logExceptions ATTENTION: SQL Error: -8, SQLState: 23504 13 août 2010 09:40:50 org.hibernate.util.JDBCExceptionReporter logExceptions GRAVE: integrity constraint violation: foreign key no action; FK42895651EA304E6 table: SUITE_VERSION

Remerciez d'avance pour votre aide.

Cordialement,

Florent,

P.S: Désolé pour mon anglais, je suis français.

Répondre

2

But i have some problem when i delete a Suite whose have SuiteVersion associated. Hibernate don't delete SuiteVersion before Suite .

C'est parce que vous n'êtes pas en cascade l'opération REMOVESuite-SuiteVersion. Pour obtenir le résultat souhaité, vous avez besoin quelque chose comme ceci (en supposant que vous utilisez JPA 1.0):

@OneToMany(mappedBy = "suite", cascade = javax.persistence.CascadeType.REMOVE) 
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN) 
private List<SuiteVersion> listSuiteVersion = new ArrayList<SuiteVersion>(); 

J'utilisé les noms qualifiés pour montrer clairement les annotations Hibernate spécifique et la norme JPA ici.

La mise en veille prolongée CascadeType.DELETE_ORPHAN spécifique est autre chose, il est utilisé pour dire Hibernate pour supprimer un SuiteVersion spécifique si vous le retirez de la collection (sans elle, le dossier SuiteVersion serait mis à jour pour supprimer le lien vers le parent Suite mais resterait dans la table, étant ainsi un "orphelin"). Notez que si vous utilisez JPA 2.0 (c'est-à-dire Hibernate 3.5+), il existe désormais un moyen standard de traiter les enregistrements orphelins, c'est-à-dire sans utiliser l'annotation spécifique à Hibernate. Vous pouvez spécifier une option orphanRemoval dans votre association OneToMany (et OneToOne). Comme ceci:

@OneToMany(mappedBy = "suite", cascade = CascadeType.REMOVE, orphanRemoval = true) 
private List<SuiteVersion> listSuiteVersion = new ArrayList<SuiteVersion>(); 

Mais cela va au-delà de cette question car ce n'est pas vraiment ce que vous cherchez.

+0

Vous avez raison. DELETE_ORPHAN fonctionne uniquement lorsque vous supprimez l'entité associée de la collection. (+1) –

+0

Merci, cela m'aide beaucoup. Mais j'ai juste passer à JPa 2.0 avant d'apprendre votre message. À la fin de votre message, vous parlez d'une nouvelle façon standard de gérer les orphelins. Pouvez-vous m'expliquer cette nouvelle façon de traiter cet orphelin? – Delildor

+0

@Delildor: De rien. Concernant les orphelins avec JPA 2.0, voir ma mise à jour. –