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

Hibernate Java Discussion :

@Embeddable // erreur


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Par défaut @Embeddable // erreur
    bonjour,
    je travail avec Jpa hibernate 2.1, mon model est une classe annotée de plusieurs ManyToOne, voici le code ;
    error : This class has a composite primary key. It must use an ID class.

    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
    package flights;
     
    import java.io.Serializable;
     
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.ManyToOne;
     
    @Entity // This class has a composite primary key. It must use an ID class.
    public class Route implements Serializable {
        private static final long serialVersionUID = -2403746842148223177L;
     
        private String airlineCode;
     
        @ManyToOne
        @Id
        private Airline airline;
     
        private String sourceCode;
     
        @ManyToOne
        @Id
        private Airport source;
     
        private String destinationCode;
     
        @ManyToOne
        @Id
        private Airport destination;
     
        private Boolean codeshare;
     
        private Short stops;
     
        private String equipment;
          /**
          *****************************
         Getters and Setters
         *******************************
           */
    Suite a une erreur de codage je suis obligé d'éclater ma classe en deux classes, voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    @Embeddable
    public final class RouteId implements Serializable {
     
      @ManyToOne
      private Airline airline;
     
      @ManyToOne
      private Aiport airport;
     
      @ManyToOne
      private Airport destination;
     
    }
    C'est la première fois que j'utilise @Embeddable, mais j'ai du mal a maitriser le concept !

    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
    public final class Route implements Serializable {
     
      @Id
      private RouteId id;
     
      private String sourceCode;
     
      private String destinationCode;
     
      private boolean codeshare;
     
      private short stops;
     
      private String equipment;
     
    }
    Eclipse me retoune une erreur sur le @Embeddable ; The Java class for mapped type "flights.RouteId" is final.

    J'ai effectué des recherche sur le net mais j'assimile pas le @Embeddable

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2011
    Messages : 251
    Par défaut
    Il y a plusieurs problèmes, commençons par le premier message d'erreur.

    error : This class has a composite primary key. It must use an ID class.
    La classe "Route" contient plusieurs propriétés annotées @Id (Airport source et Airport destination), c'est impossible car l'objet ne peut porter qu'une seule identité (Equivalent d'une clef primaire côté base de données).

    La clef primaire qui définit l'identité unique de "Route" est dite composite, c'est à dire constituée de plusieurs propriétés issues d'autres entités.

    C'est pour cela que la couche de persistance râle parce qu'elle est incapable de déterminer ce qui définit l'unicité de ton entité "Route".

    @Embeddable répond à ce besoin de gestion d'une clef primaire composite, c'est ce qui a été fait en créant une classe "RouteId" qui définit uniquement l'identité de l'entité "Route".

    Le dernier message d'erreur "The Java class for mapped type "flights.RouteId" is final.", ( où est défini cette propriété "flights" ?) semble indiquer que la classe est en "final".

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    quand il y a plusieurs @Id il faut soit ajouter @IdClass sur la classe, voir un exemple : http://www.thejavageek.com/2014/05/0...class-example/
    soit utiliser @EmbeddedId au lieu des @Id et définir la classe contenant les champs de la PK comme @Embeddable
    (dans les 2 cas la classe contenant les champs de la PK DOIt être Serializable)

    autre discussion sur les + et - des 2 solutions :
    https://stackoverflow.com/questions/...-or-embeddedid

  4. #4
    Membre éclairé Avatar de philo71
    Profil pro
    Account manager
    Inscrit en
    Avril 2005
    Messages
    242
    Détails du profil
    Informations personnelles :
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Account manager

    Informations forums :
    Inscription : Avril 2005
    Messages : 242
    Par défaut
    J'avoue que j'ai un peu de mal a suivre, Car ce projet sort de mon cours.
    Après avoir discuté et lu de la documentation sur internet, j'ai remanié mon code source.

    Class Route


    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
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    package flights;
     
    import java.io.Serializable;
     
    import javax.persistence.EmbeddedId;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.ManyToOne;
    import javax.persistence.MapsId;
     
        @Entity
        public class Route {
            @EmbeddedId // Embedded ID class should include method definitions for equals() and hashcode()
            private RouteId id;
     
            private String airlineCode;
     
            @ManyToOne //The type of the ID mapped by the relationship 'airline' does not agree with the primary key class of the target entity.
            @MapsId("airlineId")
            private Airline airline;
     
            private String sourceCode;
     
            @ManyToOne // The type of the ID mapped by the relationship 'source' does not agree with the primary key class of the target entity.
            @MapsId("sourceId")
            private Airport source;
     
            private String destinationCode;
     
            @ManyToOne // The type of the ID mapped by the relationship 'destination' does not agree with the primary key class of the target entity.
            @MapsId("destinationId")
            private Airport destination;
     
            private Boolean codeshare;
     
            private Short stops;
     
            private String equipment; 
            public RouteId getId() {
                return id;
            }
     
            public void setId(RouteId id) {
                this.id = id;
            }
     
            public String getAirlineCode() {
                return airlineCode;
            }
     
            public void setAirlineCode(String airlineCode) {
                this.airlineCode = airlineCode;
            }
     
            public Airline getAirline() {
                return airline;
            }
     
            public void setAirline(Airline airline) {
                this.airline = airline;
            }
     
            public String getSourceCode() {
                return sourceCode;
            }
     
            public void setSourceCode(String sourceCode) {
                this.sourceCode = sourceCode;
            }
     
            public Airport getSource() {
                return source;
            }
     
            public void setSource(Airport source) {
                this.source = source;
            }
     
            public String getDestinationCode() {
                return destinationCode;
            }
     
            public void setDestinationCode(String destinationCode) {
                this.destinationCode = destinationCode;
            }
     
            public Airport getDestination() {
                return destination;
            }
     
            public void setDestination(Airport destination) {
                this.destination = destination;
            }
     
            public Boolean getCodeshare() {
                return codeshare;
            }
     
            public void setCodeshare(Boolean codeshare) {
                this.codeshare = codeshare;
            }
     
            public Short getStops() {
                return stops;
            }
     
            public void setStops(Short stops) {
                this.stops = stops;
            }
     
            public String getEquipment() {
                return equipment;
            }
     
            public void setEquipment(String equipment) {
                this.equipment = equipment;
            }
     
     
        }
    Class RouteId

    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
    package flights;
     
    import java.io.Serializable;
     
    import javax.persistence.Embeddable;
     
    @Embeddable // The Java class for mapped type "flights.RouteId" is final
    public final class RouteId implements Serializable {
     
        private static final long serialVersionUID = -2403746842148223177L;
     
        // assuming all Long ids
        private Long airlineId;
        private Long sourceId;
        private Long destinationId;
     
        // Omitted: constructors, getters/setters
        // Omitted: equals, hashCode and toString methods
    }

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Evitez "final" sur les classes utilisées par JPA, vous risquez des emm... avec certains ORM et la manière dont le code est instrumenté et le type de proxy générés.

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

Discussions similaires

  1. Erreur fréquente avec ASP et IIS
    Par Community Management dans le forum ASP
    Réponses: 2
    Dernier message: 11/02/2004, 22h20
  2. Check Url pour savoir si erreur 404 ou si le site existe
    Par Clément[Delphi] dans le forum Composants VCL
    Réponses: 2
    Dernier message: 07/08/2002, 13h49
  3. Réponses: 2
    Dernier message: 27/05/2002, 19h46
  4. erreur IDL:omg.org/CORBA/MARSHAL:1.0
    Par Pinggui dans le forum CORBA
    Réponses: 3
    Dernier message: 13/05/2002, 15h05
  5. [Kylix] Erreur objet
    Par Anonymous dans le forum EDI
    Réponses: 1
    Dernier message: 22/03/2002, 09h41

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