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 :

Souci avec les ENUM Postgres


Sujet :

JPA Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Par défaut Souci avec les ENUM Postgres
    salut tout le monde

    je suis en train de devenir dingue à cause d'une ENUM que j'ai dans Postgres que j'essaie de mapper sur une ENUM Java

    Quand je fais un select dans la table, mon entité récupère bien l'élément de l'énumération mais quand j'essaie de persister Postgres retourne une erreur

    ERREUR: l'opérateur n'existe pas : cb_def.study_status = character varying
    J'utilise JPA en passant par EclipseLink et pour tout un tas de raisons je ne souhaite pas retourner vers Hibernate

    j'ai bien essayé cette méthode mais ça ne fonctionne pas mieux

    quelqu'un aurait une idée ?

    voici mon entité :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
     
    import java.io.Serializable;
     
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.EnumType;
    import javax.persistence.Enumerated;
    import javax.persistence.GeneratedValue;
    import javax.persistence.GenerationType;
    import javax.persistence.Id;
    import javax.persistence.SequenceGenerator;
    import javax.persistence.Table;
     
    import com.persistence.def.StudyStatus;
     
    /**
     * Entité faisant le lien avec la table cb_id.study de la base de données centrale.
     * 
     */
    @Entity
    @Table(name="cb_id.study")
    public class Study implements Serializable {
     
      private static final long serialVersionUID = 1L;
     
      private Integer pk = null;
      private String name = null;
      private StudyStatus currentStatus = null;
     
      @Id
      @GeneratedValue(
        strategy=GenerationType.SEQUENCE, 
        generator="cb_id.study_study_pk_seq"
      )
      @SequenceGenerator(
        name="cb_id.study_study_pk_seq", 
        sequenceName="cb_id.study_study_pk_seq", 
        allocationSize=1
      )
      @Column(name="study_pk")
      public Integer getPk() { return pk; }
      public void setPk(Integer pk) { this.pk = pk; }
     
      @Column(name="study_name")
      public String getName() { return name; }
      public void setName(String name) { this.name = name; }
     
      @Column(name="current_study_status")
      @Enumerated(EnumType.STRING)
      public StudyStatus getCurrentStatus() { return currentStatus; }
      public void setCurrentStatus(StudyStatus status) { this.currentStatus = status; }
     
      public Study(Integer pk, String name, StudyStatus status) {
        this.pk = pk;
        this.name = name;
        this.currentStatus = status;
      }
     
      public Study() {
     
      }
     
      @Override
      public String toString() {
        return "("+pk+", "+name+", "+currentStatus.toString()+")";
      }
     
    }
    mon énumération Java :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    /**
     * Enumération des défintions contenues dans l'énumération cb_def.study_status de la base de 
     * données centrale.
     * 
     */
    public enum StudyStatus {
     
      ongoing, 
      locked;
     
    }
    mon code SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    CREATE TYPE cb_def.study_status AS ENUM (
      'ongoing', 
      'locked'
    );
     
    CREATE TABLE cb_id.study (
      study_pk                  SERIAL,
      study_name                VARCHAR(255) NOT NULL,
      current_study_status      cb_def.study_status NOT NULL,
      PRIMARY KEY(study_pk),
      UNIQUE(study_name)
    );

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 25
    Par défaut
    après avoir passé quelques temps à me casser les dents j'ai enfin trouvé une alternative

    pour la lecture des infos contenues dans la base, JPA/EclipseLink permet effectivement de faire mapper une enum postgres (qui est en fait un type custom !) avec une enum java

    là où ça se corse, c'est lors de la persistence d'un objet contenant une enum puisque postgres attend le type custom et reçoit une chaîne de caractères

    puisque rien n'est simple pour résoudre ce problème j'ai décidé d'abandonner mon enum postgres pour en faire une table comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    CREATE TABLE cb_def.study_status (
      study_status_code VARCHAR(31) PRIMARY KEY
    );
     
    INSERT INTO cb_def.study_status (study_status_code) VALUES 
      ('ongoing'),
      ('locked');
    ma table devient alors :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE cb_id.study (
      study_pk                  SERIAL,
      study_name                VARCHAR(255) NOT NULL,
      current_study_status      VARCHAR(31) NOT NULL REFERENCES cb_def.study_status(study_status_code),
      PRIMARY KEY(study_pk),
      UNIQUE(study_name)
    );
    et le truc génial est que du côté de mon code java je n'ai rien à modifier

    j'espère que ça pourra aider quelques un d'entre vous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Dates] souci avec les dates
    Par Ludo75 dans le forum Langage
    Réponses: 3
    Dernier message: 22/02/2006, 17h15
  2. Soucis avec les JTables et les listener
    Par shingo dans le forum Composants
    Réponses: 2
    Dernier message: 22/02/2006, 11h51
  3. Soucis avec les Graphiques dans les états
    Par Chococrocq dans le forum IHM
    Réponses: 27
    Dernier message: 04/01/2006, 19h03
  4. petit soucis avec les listes
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 03/09/2005, 10h08
  5. Réponses: 7
    Dernier message: 05/10/2004, 13h44

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