IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

Problème de suppression en cascade


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 51
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 168
    Par défaut Problème de suppression en cascade
    Bonjour

    J'ai 2 tables définies comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    @Entity(name = "decoder")
    public class JpaDecoder implements Decoder {
            @Id
    	@GeneratedValue
    	@Column(name = "id")
    	private int m_id;
            @OneToMany(cascade = { CascadeType.ALL }, orphanRemoval = true)
    	private List<JpaDecoderHistory> history;
    ...
    }
     
    @Entity(name = "decoder_history")
    public class JpaDecoderHistory implements DecoderHistory {
     
    	@Id
    	@GeneratedValue
    	@Column(name = "id")
    	private int m_id;
    	@ManyToOne
    	@JoinColumn(name = "decoder_id", referencedColumnName = "id")
    	private JpaDecoder m_decoder;
    ...
    }
    J'ai défini un cascading de type ALL, je m'attends donc à ce que les éléments de decoder_history soient supprimés lorsque je supprime un decoder.
    Or ça ne marche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	public void delete(Decoder p_decoder) {
    		m_em.remove(p_decoder);
    	}
     
    donne
     
    DEBUG org.hibernate.SQL - delete from decoder where id=?
    Hibernate: delete from decoder where id=?
    DEBUG o.h.e.jdbc.spi.SqlExceptionHelper - could not execute statement [n/a]
    org.postgresql.util.PSQLException: ERREUR: UPDATE ou DELETE sur la table « decoder » viole la contrainte de clé étrangère
    « fk_cwhe6rg1kaeauno9hxsc8rbo3 » de la table « decoder_history »
      Détail*: La clé (id)=(565) est toujours référencée à partir de la table « decoder_history ».
    Qu'est ce qui manque ???

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Tu as une contrainte d'intégrité de ta table decoder_history vers la table decoder, donc, jpa commence par supprimer l'enregistrement "decoder" avant de supprimer les orphelins de "decoder_history" et là, problème... la DB rejette la demande (ce qui est normal)

    Je suppose que tu n'as pas défini la contrainte d'intégrité avec un cascade delete dans ce genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ... CONSTRAINT PRJDLIB.fk_MODELE_BUDGET_LIGNE1
        FOREIGN KEY (UID_MDL_BDG)
        REFERENCES PRJDLIB.MDL_BDG (UID )
        ON DELETE CASCADE
        ON UPDATE NO ACTION
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Femme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 51
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 168
    Par défaut
    Bonjour

    J'ai réglé mon pb différemment :
    J'ai constaté que la table de jointure entre decoder et decoder_history n'était pas renseignée, et c'est ce qui semblait bloquer la suppression en cascade.
    Pour que cette table soit renseignée j'ai du modifier la façon dont je persiste mes éléments history, j'ai remplacé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    JpaDecoderHistory history = new JpaDecoderHistory();
    history.setDate(new Date());
    history.setDecoder(decoder);
    history.setValue((int) debit);
    m_decoderHistoryDao.create(history);
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    JpaDecoderHistory history = new JpaDecoderHistory();
    history.setDate(new Date());
    history.setDecoder(decoder);
    history.setValue((int) debit);
    decoder.getHistory().add(history);
    m_decoderDao.modify(decoder)
    Autrement dit, au lieu de créer directement mon history, je l'ajoute à la liste des history existants et je persiste le decoder qui va créer l'history en cascade...
    Je ne comprend pas trop pourquoi je suis obligée de faire comme ça...

  4. #4
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Ça ne va pas régler ton problème de suppression cascade.

    Pour le reste, il est évident que si tu as un objet decoder qui possède un Set de decoder_history et que tu déclares CascadeType.ALL, il faut persister les modifications via decoder.
    Ceci implique que tu charges la liste de decoder_history systématiquement en même temps que l'instance de decoder, il serait judicieux le définir un FetchType.EAGER.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. Réponses: 0
    Dernier message: 13/04/2010, 21h10
  2. [SQL2K] probléme de suppression en cascade
    Par oxino dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 16/02/2009, 15h08
  3. Problème de suppression en cascade.
    Par Orgied dans le forum Débuter
    Réponses: 4
    Dernier message: 28/01/2009, 14h44
  4. Problème avec suppression en cascade
    Par agur29 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 26/07/2007, 11h42
  5. Problème de suppressions en cascade redondantes
    Par [DreaMs] dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 20/07/2007, 15h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo