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 references SQL, Violates foreign key constraint


Sujet :

JPA Java

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 34
    Points : 13
    Points
    13
    Par défaut JPA references SQL, Violates foreign key constraint
    Bonjour,

    J'essaie de faire une application qui utilise JPA. J'ai 2 classes, lorsque mon fichier schema.sql est généré, j'obtiens ceci:

    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
     
    create table BIMOBJ (
            BIM_ID int4 not null,
            VERSION int4 not null,
            REFERENCE varchar(30) not null unique,
            primary key (BIM_ID)
        );
     
        create table BimData (
            ID int4 not null,
            lat float8 not null,
            lon float8 not null,
            TIME date not null,
            primary key (ID)
    );
    Et voici ce que je voudrais obtenir, quelque chose dans le genre:
    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
     
    create table BIMOBJ (
            BIM_ID int4 not null,
            VERSION int4 not null,
            REFERENCE varchar(30) not null unique,
            primary key (BIM_ID)
        );
     
        create table BimData (
            ID int4 not null,
            lat float8 not null,
            lon float8 not null,
            TIME date not null,
            BIM_ID int4 Reference BIMOBJ,
            primary key (ID)
        );
    Voici mes classes Java:

    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
     
    @SuppressWarnings("unused")
    @Entity
    @Table(name="BIMOBJ")
    public class BimObj {
         @Id
    	@Column(name = "BIM_ID", nullable = false)
    	private Integer bim_id;
     
    	@Column(name = "VERSION", nullable = false)
    	@Version
    	private int version;
     
    	@Column(name = "REFERENCE", length = 30, nullable = false, unique = true)
    	private String ref = null;
     
    ...
    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
     
    @SuppressWarnings("unused")
    @Entity
    @Table(name="BimData")
    public class BimData {
     
    	@Id
    	@Column(name = "ID", nullable = false)
    	private Integer id;
     
    	@Embedded
    	private Position pos = null;
     
    	@Column(name="TIME", nullable = false)
    	@Temporal(TemporalType.DATE)
    	private Date horodate = null;
     
    	@JoinColumn(name = "bim_id", referencedColumnName = "bim_id", unique=false)
    	private BimObj bimObj = null;
     
    ...
    Alors comment je pourrais ajouter la colonne bim_id à la table bimData ?

    Merci d'avance.

  2. #2
    Membre à l'essai
    Inscrit en
    Janvier 2006
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 34
    Points : 13
    Points
    13
    Par défaut
    Bonjour,

    Je pense que j'ai réussi, enfin je ne suis pas réellement sur. Voici mon nouveau schema.sql, qui représente un peu plus ce que je voudrais.

    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
    28
    29
    30
    31
    32
    33
    34
     
    create table BIMOBJ (
            BIM_ID int4 not null,
            VERSION int4 not null,
            ref varchar(30) unique,
            primary key (BIM_ID)
        );
     
        create table BimData (
            BIMDATA_ID int4 not null,
            lat float8 not null,
            lon float8 not null,
            TIME timestamp not null,
            BIM_ID int4 not null,
            alerte_id int4 not null,
            primary key (BIMDATA_ID)
        );
     
        create table alerte (
            ALERTE_ID int4 not null,
            VERSION int4 not null,
            MESSAGE varchar(255) not null unique,
            primary key (ALERTE_ID)
        );
     
        alter table BimData 
            add constraint FK5CA885B08CF35A88 
            foreign key (BIM_ID) 
            references BIMOBJ;
     
        alter table BimData 
            add constraint FK5CA885B0870CF29D 
            foreign key (alerte_id) 
            references alerte;
    Et voici mes classes java:

    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
     
    @SuppressWarnings("unused")
    @Entity
    @Table(name="BIMOBJ")
    public class BimObj {
     
    	@Id
    	@Column(name = "BIM_ID", nullable = false)
    	private Integer bim_id;
     
    	@Column(name = "VERSION", nullable = false)
    	@Version
    	private int version;
     
    	@Column(name = "ref", length = 30, nullable = true, unique = true)
    	private String ref = null;
     
    	@OneToOne(cascade = CascadeType.ALL, fetch=FetchType.EAGER, mappedBy = "bim_id")
    	private BimData bimData = null;
     
    ...
    }
    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
    28
     
    @SuppressWarnings("unused")
    @Entity
    @Table(name="BimData")
    public class BimData {
     
    	@Id
    	@Column(name = "BIMDATA_ID", nullable = false)
    	@GeneratedValue(strategy = GenerationType.AUTO)
    	private Integer bimData_id;
     
    	@Embedded
    	private Position pos = null;
     
    	@Column(name="TIME", nullable = false)
    	@Temporal(TemporalType.TIMESTAMP)
    	private Date horodate = null;
     
    	@OneToOne
    	@JoinColumn(name = "BIM_ID", unique = false, nullable = false)
    	private BimObj bim_id;
     
    	@OneToOne
    	@JoinColumn(name = "alerte_id", unique = false, nullable = false)
    	private Alerte alerte_id;
     
    ...
    }
    Seulement, j'ai un problème. Lorsque je veux supprimer un objet de type BimObj, je voudrais que ça supprime aussi les objets BimData qui ont l'id de BimObj.

    J'ai ajouté le CascadeType.ALL. Mais à la suppression jai cette erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Caused by: org.postgresql.util.PSQLException: ERROR: update or delete on table "bimobj" violates foreign key constraint "fk5ca885b08cf35a88" on table "bimdata"
      Détail : Key (bim_id)=(1) is still referenced from table "bimdata".
    Je comprends pas, avec le cascade all, ça devrait marcher ?

    Que pensez vous qui ne va pas ?

    merci

  3. #3
    Membre habitué Avatar de xv-mnt
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2005
    Messages : 142
    Points : 178
    Points
    178
    Par défaut
    Pour ton cas, tu peux ajouter une @OneToOne de BimObj vers BimData, sur laquelle tu vas ajouter un CascadeAll. Comme c'est BimData qui porte la FK, il faut indiquer dans BimOnbj que le lien est référencé dans BimData par l'attribut bim_id :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    @OneToOne(cascade = {CascadeType.ALL}, mappedBy="bim_id")
    private BimData data;
    Ainsi le delete sera propagé directement.

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/06/2015, 14h44
  2. Réponses: 4
    Dernier message: 22/11/2010, 09h55
  3. Message d'erreur 'violation of FOREIGN KEY constraint' de Interbase
    Par abdelghani_k dans le forum Bases de données
    Réponses: 3
    Dernier message: 03/06/2007, 09h11
  4. [C#/MS ACCESS] foreign key constraint
    Par GeantVert13 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 01/09/2006, 22h38
  5. [clés étrangères] a foreign key constraint fails
    Par guidav dans le forum Débuter
    Réponses: 15
    Dernier message: 09/08/2006, 23h50

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