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 :

persister une classe abstraite


Sujet :

JPA Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Par défaut persister une classe abstraite
    bonjour,

    supposons que j'ai une classe abstraite comme 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
    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
    package Metier.Promotion.EtatsSemestre;
     
    import DAO.DB.IDataBase;
    import Metier.Enseignant.Enseignant;
    import Metier.Etudes.Module;
    import Metier.Etudiant.Etudiant;
    import Metier.Promotion.Semestre;
    import java.util.List;
    import javax.persistence.*;
     
    /**
     *
     * @author bassim
     */
     
    @Entity
    @Table(name="Etat_Semestre")
    abstract public class AbstractEtatSemestre implements IDataBase {
     
        @Id
        @GeneratedValue(strategy = GenerationType.AUTO)
        private Long id;
     
        @OneToOne(mappedBy = "etat")
        protected Semestre semestre;
     
        abstract public void mettreEnAttente() ;
     
        abstract public void commencer() throws Exception;
     
        abstract public void terminer() throws Exception;
     
        abstract public void ajouterEtudiants(List<Etudiant> etudiants) throws Exception;
     
        abstract public void ajouterEtudiant(Etudiant etudiant) throws Exception;
     
        abstract public void enleverEtudiant(Etudiant etudiant) throws Exception; 
     
        abstract public void affecterEnseignant(Module module,Enseignant ensei) 
                                                            throws Exception;
     
        public Long getId() {
            return id;
        }
     
        public void setId(Long id) {
            this.id = id;
        }
    }
    et une autre classe concrète qui l'étends :
    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
    package Metier.Promotion.EtatsSemestre;
     
    import Metier.Enseignant.Enseignant;
    import Metier.Etudes.Module;
    import Metier.Etudiant.Etudiant;
    import Metier.Promotion.Semestre;
    import java.util.List;
     
    /**
     *
     * @author bassim
     */
    public class EtatEnAttente extends AbstractEtatSemestre {
        static private final long serialVersionUID = 731L;
     
        /** Creates a new instance of EtatEnAttente */
        public EtatEnAttente(Semestre semestre) {
            this.semestre = semestre;
     
        }
     
        public void mettreEnAttente() {
     
        }
     
        public void commencer() throws Exception {
     
            if (semestre.getEtudiants().size() == 0)
                throw new Exception("Aucun étudiant n'est inscrit " +
                        "à la promotion !");
     
           /* if (semestre.getEnseignants().size() == 0)
                throw new Exception("Aucun enseignant n'a été affecté à la promotion !");*/
            if (semestre.getCours().isEmpty())
                throw new Exception("Aucun module n'existe !");
     
            if (semestre.getCours().containsValue(null))
                throw new Exception("Vous devez affecter un enseignant " +
                        "pour chaque module !");
     
     
            semestre.setEtat(new EtatEnCours(semestre));
            semestre.notifier();
        }
     
     
        public void terminer() throws Exception {
            throw new Exception("Le semestre n'a pas encore commencé !");
        }
     
        public void ajouterEtudiants(List<Etudiant> etudiants) throws Exception {
     
                // cette instruction doit venir aprés
                semestre.getEtudiants().addAll(etudiants);
     
                semestre.notifier();
     
        }
     
        public void ajouterEtudiant(Etudiant etudiant) throws Exception {
            if (etudiant != null) {
                if (semestre.getEtudiants().contains(etudiant))
                    throw new Exception("Cet étudiant appartient déjà à la promotion !");
     
                if (semestre.getNumero() == 1)
                    etudiant.ajouterPromotion(semestre.getSemestre().getPromotion()); 
                // cette instruction doit venir aprés
                semestre.getEtudiants().add(etudiant);
                semestre.notifier();
            }
        }
     
        public void enleverEtudiant(Etudiant etudiant) throws Exception {
            if (etudiant != null)
                if (semestre.getEtudiants().remove(etudiant)) System.out.println("trouvé");
     
     
        }
     
        public void affecterEnseignant(Module module, Enseignant ensei)
        throws Exception {
            if (semestre.getCours().containsValue(ensei))
                throw new Exception("Cet enseignant est dèjà " +
                        "en charge d'un module !");
            else semestre.getCours().put(module,ensei);
        }
     
        public void save() {
        }
     
        public void update() {
        }
     
        public void delete() {
        }
     
    }
    normalement si on persiste une instance de la classe EtatEnAttente, y'aura qu'une seule table crée dans la BDD correspondant à AbstractEtatSemestre

    maintenant, si on ajoute un attribut persistant à EtatEnAttente, la classe ne corresponds plus vraiment à la classe AbstractEtatSemestre et la table générée dans la BDD.

    Comment JPA gère ce mécanisme ?

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 156
    Par défaut
    Documente toi sur l'héritage avec JPA.
    http://java.sun.com/developer/techni...EE/jpa/#inpoly

  3. #3
    Membre chevronné Avatar de bassim
    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Février 2005
    Messages
    666
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 666
    Par défaut
    La réponse se trouve ici : JPA

    En fait, une table va être crée pour chaque classe concrète qui va étendre la classe abstraite

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 156
    Par défaut
    Je n'ai pas tout lu, mais il me semble qu'il y a un choix pour la stratégie de mapping d'héritage et que tu peux également avoir une table unique pour toute ta hiérarchie.

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

Discussions similaires

  1. [Hibernate Annotation] Mapper une classe abstraite
    Par DanZzz dans le forum Hibernate
    Réponses: 3
    Dernier message: 15/06/2006, 23h12
  2. "Instancier" une classe abstraite
    Par alex6891 dans le forum Langage
    Réponses: 5
    Dernier message: 03/05/2006, 11h56
  3. [Débutant]Passer une classe abstraite en paramètre
    Par Invité dans le forum Débuter
    Réponses: 2
    Dernier message: 06/01/2006, 18h56
  4. Réponses: 2
    Dernier message: 27/03/2005, 17h09
  5. [Debutant] Une classe abstraite en parametre ?
    Par kiroukou dans le forum Débuter
    Réponses: 8
    Dernier message: 03/02/2005, 16h05

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