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 :

OneToOne save et Heritage


Sujet :

JPA Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 13
    Points : 12
    Points
    12
    Par défaut OneToOne save et Heritage
    Bonjour,

    J'ai la problématique suivante:
    3 objets, stagiaire, formateur et commercial
    ce sont tout les 3 des personnes et chaque personne peux être à la fois stagiaire, formateur et commercial
    le formateur et le commercial sont des salariés.

    Donc j'ai:
    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
     
    @Entity
    @Table(name = "Personne")
    @Inheritance(strategy=InheritanceType.JOINED)
    public class Personne
    {
            @Id
    	@GeneratedValue(strategy = GenerationType.IDENTITY)
    	@Column(name = "Id", updatable = false, nullable = false)
    	protected Long id;
     
            @Column(name="nom")
    	protected String nom;
     
    	public String getNom() {return nom;}
    	public void setNom(final String nom){this.nom = nom;}
    }
     
    @Entity
    @Table(name = "Salarie")
    public class Salarie extends Personne
    {
            @Column(name = "dateNaissance",nullable = true)
    	@Temporal(TemporalType.DATE)
    	private Date dateNaissance;
     
            public Date getDateNaissance() {return dateNaissance;}
    	public void setDateNaissance(Date dateNaissance) {this.dateNaissance = dateNaissance;}
    }
     
    @Entity
    @Table(name = "Stagiaire")
    public class Stagiaire 
    {
            @Id
    	@GeneratedValue(strategy = GenerationType.IDENTITY)
    	@Column(name = "Id", updatable = false, nullable = false)
    	protected Long id;
     
            @OneToOne(cascade = CascadeType.ALL)
    	@JoinColumn(name = "Id_Personne", nullable = true)
    	private Personne personne;
    }
     
    @Entity
    @Table(name = "Commercial/Formateur")
    public class Commercial/Formateur  extends BaseEntity 
    {
     
    	@Id
    	@GeneratedValue(strategy = GenerationType.IDENTITY)
    	@Column(name = "Id", updatable = false, nullable = false)
    	protected Long id;
     
    	@OneToOne(cascade = CascadeType.ALL)
    	@JoinColumn(name = "Id_salarie", nullable = true)
    	private Salarie salarie;
    }
    Lorsque je créer un stagiaire/formateur/commercial je choisi une personne si elle existe sinon j'en créer une nouvelle.
    Avec CascadeType.ALL lors du merge(stagiaire/formateur/commercial) il m'en crée un nouveau de façon systématique hors je souhaite que le système mette a jours si personne.Id existe et créer si pas de personne.Id.
    Avec CascadeType.MERGE lors du merge(stagiaire/formateur/commercial) il m'en crée pas un nouveau par contre le système met a jours si personne.Id existe


    Et deuxième point si je veux créer un nouveau formateur à partir d'un ancien stagiaire je doit transformer une personne en salarie sans créer une nouvelle ligne dans la BDD est ce possible?

  2. #2
    Membre à l'essai
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Petite erreur de ma part dans le post
    Avec CascadeType.ALL lors du merge(stagiaire/formateur/commercial) il m'en crée un nouveau de façon systématique hors je souhaite que le système mette a jours si personne.Id existe et créer si pas de personne.Id.
    Avec CascadeType.MERGE lors du merge(stagiaire/formateur/commercial) il m'en crée pas un nouveau par contre le système met a jours si personne.Id existe
    en fait j'aurai du ecrire:
    Avec CascadeType.ALL lors du persit(stagiaire/formateur/commercial) il m'en crée un nouveau de façon systématique hors je souhaite que le système mette a jours si personne.Id existe et créer si pas de personne.Id.
    Avec CascadeType.MERGE lors du persit(stagiaire/formateur/commercial) il m'en crée pas un nouveau par contre le système met a jours si personne.Id existe
    Et du coup la réponse à ma question est: remplacer persit par merge et cela fonctionne.

    pour le 2eme point:
    Et deuxième point si je veux créer un nouveau formateur à partir d'un ancien stagiaire je doit transformer une personne en salarie sans créer une nouvelle ligne dans la BDD est ce possible?
    Il semble que cela soit impossible, si quelqu'un peu confirmer.

  3. #3
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    salut,
    cela serait plus simple de transformer tes entites autrement?

    Eric

  4. #4
    Membre à l'essai
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    J'ai pas eu le choix j'ai fusionné personne et salarie, mais je perd une logique

  5. #5
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    Car tu as:
    - Personne
    - Salarie
    - Stagiaire
    - Commercial/Formateur

    qui sont en principe des personnes avec des roles ou fonctions differents.

    Alors pourquoi ne pas les juméles et ainsi avoir plus de clarté dans ta logique.
    Eric

  6. #6
    Membre à l'essai
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Désole je te suis pas.

    Un formateur/commercial est un salarie
    Un stagiaire/formateur/commercial est une personne
    Une personne est un stagiaire et/ou un formateur et/ou un commercial.
    Et une personne n'existe q'une fois bien sur.
    Un salarie est une personne particulière avec un contrat donc un héritage semble logique.

    D’où le fait d'avoir une relation @onetoone entre stagiaire/formateur/commercial et personne
    Ainsi une personne peut facilement être les 1 2 ou les 3.

    J’aurai voulu transformer une personne en salarie.

    scenario:
    Mme Dupont stagiaire est saisie (une ligne dans personne et une dans stagiaire)
    Elle revient plus tard comme formatrice ( j'aurai voulu faire un upgrade vers salarie et garde ma ligne dans personne, garde la ligne stagiaire et ajoute une ligne formateur).

    Ayant supprimer salarie j'ai maintenant
    Mme Dupont stagiaire est saisie (une ligne dans personne et une dans stagiaire)
    Elle revient plus tard comme formatrice ( une ligne dans personne, une ligne stagiaire et ajoute une ligne formateur).
    Mme Dupont ce marie et devient Mme Durant je modifie ma table personne.

  7. #7
    Membre chevronné Avatar de jeffray03
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2008
    Messages
    1 501
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 501
    Points : 2 120
    Points
    2 120
    Par défaut
    salut,
    qu´est ce qui differencie un Salarié d´un stagiaire d´un salarié a commercial?
    Tu dois regrouper toute les propriétes qu´ils ont en commun, ensuite voir ceux qui sont individuels.


    Eric

  8. #8
    Membre à l'essai
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Décembre 2015
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 13
    Points : 12
    Points
    12
    Par défaut
    Un stagiaire n'est pas un salarié.
    Un formateur et un commercial sont des salariés c'est d’ailleurs pour cela que j'ai créer la notion de salarie.
    Et donc je regroupe les données légale a cette endroit numéro SS par exemple.
    Ensuite pour chaque métier j'ai des champs et des jointures spécifiques et des utilisations spécifiques.

    L’héritage convenait bien mais techniquement pas de persistance possible.
    Le mieux c'est de relier stagiaire/formateur/commercial par une association a personne et personne a salarie pour compléter les infos.

    C'est dommage de pas pouvoir persister un objet en un de ces héritages comme une évolution.
    Techniquement en bdd il suffirait de changer le DType et ajouter l'id a la table fille (si on est en JOINED)

  9. #9
    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
    Modifier les records "par derrière" Hibernate pour changer la classe de l'objet est techniquement possible mais requiert une connaissance pointue à la fois d'Hibernate lui-même et du fonctionnement de l'application car il faut être certain de forcer la relecture de l'objet après la modification en JDBC et que les caches pouvant contenir l'objet sont elles aussi "nettoyées".
    Bref, ce n'est pas un problème trivial qui aurait pût être évité par une modélisation correcte : un formateur/commercial/... ne sont pas des personnes mais des fonctions occupées par une personne pendant un laps de temps.
    Votre taxonomie est donc sémantiquement erronée : ce qui engendre les problèmes que vous rencontrez.

Discussions similaires

  1. [Postgres] Pb d'heritage...
    Par anonia dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 23/08/2003, 22h34
  2. [PostgreSQL] Question vis a vis de l'heritage...
    Par Gandalf dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 12/05/2003, 16h53
  3. JBuilder 7 personnal sort à chaque save
    Par Hannouz dans le forum JBuilder
    Réponses: 4
    Dernier message: 17/12/2002, 22h53
  4. [VB6] [Graphisme] Dimensions d'une image au saving
    Par jeanseb dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/12/2002, 19h09
  5. Algo carry save adder
    Par bashou dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 18/10/2002, 11h32

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