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 :

classe embedded avec l'id parent


Sujet :

JPA Java

  1. #1
    Membre confirmé Avatar de Space23
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 185
    Par défaut classe embedded avec l'id parent
    Voila j'ai regroupé plusieurs attributs récurrents dans mes differents pojo et je les ai factorisé dans une seule classe, la classe "DonneesBasique". Cette classe regroupe l'id, le nom, la date de creation. Aucune table spécifique lui ai associé, elle est rattachée à la classe qui l'appelle. Les noms de colonnes associés sont surchargés par la classe parente.

    Cependant j'ai le problème suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Exception Description: Entity class [class fr.***.Personne] has no primary key specified. 
    It should define either an @Id, @EmbeddedId or an @IdClass. If you have defined PK using any of these annotations then please make sure that you do not have mixed access-type (both fields and properties annotated) in your entity class hierarchy.
    Je comprend bien le problème mais je ne sais pas comment le contourner...

    Classe Personne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @Entity
    @Table(name="PERSONNE")
    public class Personne implements Serializable {
     
    	@Embedded
    	@AttributeOverrides({
    		@AttributeOverride(name="ide", column=@Column(name="PERSONNE_ID")),
    		@AttributeOverride(name="nom", column=@Column(name="PERSONNE_NOM")),
    		@AttributeOverride(name="datCreation", column=@Column(name="PERSONNE_DATE_CREATION")),
    	})
    	private DonneesBasique donnees;
     
    	****
    }

    Classe DonnneesBasique :

    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
    @Embeddable
    public class DonneesBasique implements Serializable  {
     
    	@Basic
    	@Column(name="")
    	public Long ide;
     
    	@Column(name="", nullable=false, length=0)
    	public String nom;
     
    	@Column(name="", nullable=false)
    	public Timestamp dateCreation;
     
    	***
    }

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 968
    Par défaut
    Citation Envoyé par Space23 Voir le message
    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
    @Embeddable
    public class DonneesBasique implements Serializable  {
     
    	@Basic
    	@Column(name="")
    	public Long ide;
     
    	@Column(name="", nullable=false, length=0)
    	public String nom;
     
    	@Column(name="", nullable=false)
    	public Timestamp dateCreation;
     
    	***
    }
    @Id sur public Long ide ; …

    sinon au lieu de @Embedded votre cas correspond bien à la sémantique objet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public class Personne extends DonneesBasique
    @Embedded permet de résoudre/faciliter les situations où des champs identiques se retrouvent dans des classes qui ne participent pas de la même taxonomie… mais ce n'est pas le cas ici, donc il serait légitime que vous vous interrogiez ici sur le bien fondé de choisir @Embedded plutôt que d'avoir une hiérarchie traditionnelle de classes (DonneesBasique pourrait même être "abstract").

  3. #3
    Membre confirmé Avatar de Space23
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 185
    Par défaut
    Vous avez sans doute raison.

    Par contre j'ai peur de tomber sur la même problématique. Est-il possible avec JPA que ma classe héritée (abstraite ou non) puisse ne pas avoir d'équivalent au niveau des tables? Que toute les informations soient portées par la table Personne?

    Comment cela se traduirait en JPA?

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 968
    Par défaut
    Citation Envoyé par Space23 Voir le message
    Vous avez sans doute raison.

    Par contre j'ai peur de tomber sur la même problématique. Est-il possible avec JPA que ma classe héritée (abstraite ou non) puisse ne pas avoir d'équivalent au niveau des tables? Que toute les informations soient portées par la table Personne?

    Comment cela se traduirait en JPA?
    @MappedSuperclass

    http://download.oracle.com/javaee/5/...uperclass.html

  5. #5
    Membre confirmé Avatar de Space23
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 185
    Par défaut
    Bonjour,

    J'ai bien déclaré ma classe en @MappedSuperclass et ensuite overrider mes attributs dans les classes qui l'étendent.

    Le problème est que dans certains classes tous les attributs étendus ne sont pas forcément utilisés. Mes attributs étendus n'ont pas d'annotation @Column de défini mais JPA essayera de les mapper même sans @AttributeOverride.

    J'ai essayé de définir mes attributs étendus en @Transient mais dans ce cas là ils ne sont jamais pris en compte.

    Avez-vous une solution de contournement?

    EDIT : Ce que je voudrais pouvoir faire en gros c'est cela :
    @AttributeOverride(name="name", @Transient),

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 968
    Par défaut
    Citation Envoyé par Space23 Voir le message
    Avez-vous une solution de contournement?

    EDIT : Ce que je voudrais pouvoir faire en gros c'est cela :
    @AttributeOverride(name="name", @Transient),
    Ce n'est plus de l'OO…
    donc la première chose serait de retomber sur un design OO par un profond refactoring de vos spécifications.

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

Discussions similaires

  1. JSF/JPA probleme avec les classes embedded
    Par sorown dans le forum JSF
    Réponses: 0
    Dernier message: 02/04/2014, 13h15
  2. [D7] MySQL Embedded avec Delphi, pourquoi faire?
    Par raoulmania dans le forum Bases de données
    Réponses: 3
    Dernier message: 17/11/2005, 16h25
  3. [D7] Quelle est l'utilité de MySQL Embedded avec Delphi ?
    Par raoulmania dans le forum Bases de données
    Réponses: 1
    Dernier message: 16/11/2005, 18h40
  4. Réponses: 6
    Dernier message: 27/07/2005, 09h06
  5. Réponses: 22
    Dernier message: 05/07/2005, 00h04

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