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 :

[JPA / EclipseLink] Contrainte de clé étrangère ignorée


Sujet :

JPA Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    82
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 82
    Points : 50
    Points
    50
    Par défaut [JPA / EclipseLink] Contrainte de clé étrangère ignorée
    Bonjour à tous,

    Je fais fasse à un probleme bizarre avec Jpa.

    J'ai une relation many ToMany entre deux entités avec une table de jointure qui contiens les clé primaires des deux autres table en tant que clé étrangères.

    J'utilise plusieurs stratégie d'héritage des deux coté de la relation :

    D'un coté Oeuvre > Oeuvre Cinematographic > Film ( série etc.), de l'autre Être Vivant > personnages > personnes

    Lorsque je supprime un personnage lié à une œuvre à parti de mon application, donc un remove à partir du gestionnaire d'entité, le personnage est supprimé malgré le fait qu'il soit lié à l’œuvre à travers la table de jointure.

    Ça ne fonctionne pas lorsque je fais la suppression à partir de Mysql Workbensh ou la contrainte est bien respecté, donc JPA semble se foutre complétement des contraintes.

    Voici la configuration des mes entités pour la première hiérarchie de classe :

    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
    25
    26
    27
        @Entity
        @DiscriminatorColumn(name = "TYPEOEUVRE",discriminatorType = 
        DiscriminatorType.INTEGER)
        @Table(name="Oeuvre")
     
        public abstract class EtyOeuvre extends EtyAbstract implements 
        ItCompositeInfo,Comparable<EtyOeuvre> {
     
            @ManyToMany(cascade ={ CascadeType.PERSIST},fetch = FetchType.EAGER)
            @JoinTable(name="oeuvres_characters", joinColumns = 
                      @JoinColumn(name="oeuvres_ID"),inverseJoinColumns = 
                      @JoinColumn(name="characters_ID"))
            @OrderBy("last_name,first_name ASC")
            protected List<EtyCharacter> characters  = new 
                                         LinkedList<EtyCharacter>();
     
        }
     
        @MappedSuperclass 
        public class EtyOeuvreCinematographic extends EtyOeuvre {
     
        }
     
        @Entity @DiscriminatorValue("1") 
         public class EtySerieTv extends EtyOeuvreCinematographic {
     
        }
    Et la seconde hierarchie :
    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
     
        @Entity
        @DiscriminatorColumn(name = "TYPEHUMAN",discriminatorType = 
        public abstract class EtyHuman extends EtyAbstract implements 
        Comparable<EtyHuman>{
     
        }
     
     
        @Entity
        @DiscriminatorValue("0")
        public class EtyCharacter extends EtyHuman {
     
            @ManyToMany(mappedBy = "characters",cascade = CascadeType.PERSIST,fetch 
                        = FetchType.EAGER)
            private List<EtyOeuvre> oeuvres;
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE `oeuvres_characters` (
      `characters_ID` int(11) NOT NULL,
      `oeuvres_ID` int(11) NOT NULL,
      PRIMARY KEY (`characters_ID`,`oeuvres_ID`),
      KEY `FK_oeuvres_characters_oeuvres_ID` (`oeuvres_ID`),
      CONSTRAINT `FK_oeuvres_characters_characters_ID` FOREIGN KEY (`characters_ID`) REFERENCES `human` (`ID`),
      CONSTRAINT `FK_oeuvres_characters_oeuvres_ID` FOREIGN KEY (`oeuvres_ID`) REFERENCES `oeuvre` (`ID`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    oeuvres_charactersSELECT * FROM projecttfe.human;
    Est que vous avez déjà entendu parler de ce genre de problème, je ne sais pas si quelque chose cloche dans ma configuration ou si il s'agit d'un bug connu.

    Merci d'avance pour votre aide !

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Vos CONSTRAINT expriment que la table d'intersection doit référencer des objets existants mais ne dit rien quant aux règles de cascade...
    De toute façon, cela concerne l'exécution directe de SQL pas ce que l'ORM fait :
    Vous devriez activer le TRACE des requêtes exécutées pour comprendre dans quel ordre il exécute les UPDATE/DELETE :
    il supprime les records de la table d'intersection avant de supprimer le personnage.

Discussions similaires

  1. Double contrainte de clé étrangère
    Par eperdu dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 21/04/2010, 15h49
  2. Réponses: 29
    Dernier message: 25/11/2007, 16h08
  3. [Débutant ACCESS] Contrainte de clés étrangères
    Par elgringo2007 dans le forum Access
    Réponses: 2
    Dernier message: 12/06/2006, 18h56
  4. Réponses: 5
    Dernier message: 28/04/2006, 11h55
  5. Contraintes de clés étrangères non respectées
    Par parfait dans le forum Requêtes
    Réponses: 7
    Dernier message: 28/07/2004, 12h48

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