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 :

JPA et héritage


Sujet :

JPA Java

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2011
    Messages : 28
    Points : 20
    Points
    20
    Par défaut JPA et héritage
    Bonjour à tous. Voici un extrait très simplifié d'une partie d'un MCD de la base de données sur laquelle je travaille :
    Nom : aide.jpg
Affichages : 198
Taille : 31,8 Ko

    Ma question est certainement un peu bête, mais me laisse perplexe, car c'est la première fois que je suis confronté aux notions d'héritage sur une base de données.
    Je génère automatiquement mes entités depuis Eclipse mais la relation entre Patient et Sejour se retrouve finalement dans mon entité Personne, reprèsentée comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    @Entity
    @Inheritance(strategy = InheritanceType.JOINED)
    @DiscriminatorColumn(name = "type_personne")
    public abstract class Personne {
    ......
    // bi-directional many-to-one association to Sejour
    	@OneToMany(mappedBy = "personne")
    	private List<Sejour>			sejours;
    ......
    }
    C'est ce qui me dérange puisque de cette manière, si je ne me trompe pas, une instance de Médecin pourrait "posséder" une liste de séjour, ce qui me semble être un non sens.
    Donc ma question : est ce normal ? la relation ne devrait elle pas être dans mon entité Patient ? Est ce une erreur d' Eclipse ou plus probablement quelque chose que je n'ai pas compris ?
    D'avance merci pour votre aide...

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu génère automatiquement depuis quoi? Ta base de données? Si l'outil a généré ça, c'est probablement parce que ta base de données relie Personne et non pas Patient à Sejour.

    Quel stratégie utilise tu pour l'héritage? JPA supporte 3 stratégie: "une table par classe concrète", "une table pour la partie commune + 1 table par classe concrète" et "une table commune pour tous les enfants".

    Le plus simple si le code généré ne te plait pas, c'est de commencer à le changer Personellement j'écris toujours mes entité à la main, meilleur contrôle et je préfère laisser JPA me proposer derrière un modèle de tables que j'ajuste à la main avant les créer.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2011
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2011
    Messages : 28
    Points : 20
    Points
    20
    Par défaut
    Bonjour Tchize_, et surtout merci. J'ai suivi ton conseil, et écris mes entités "à la main", comme un grand. Cela va effectivement beaucoup mieux et je suis arrivé à ce que je voulais
    En revanche je suis confronté à un autre problème qui est certainement dans tes cordes. Dans mon appli web (jsf, Primefaces) je tente d'utiliser un genre de template dynamique avec un bean, pour modifier dynamiquement le contenu d'une partie de ma page.
    Cela marche pas mal, si ce n'est qu'un de mes "includes" doit impérativement contenir une balise <div>, avec un id spécifique. ( cela est imposé par un sdk que je dois utiliser) et là, ça ne fonctionne plus du tout
    Voici comment j'ai procédé :
    Le "layout"
    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
     
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml"   
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:ui="http://java.sun.com/jsf/facelets">
     
    <h:head>
    	<!-- import des css -->
    	<h:outputStylesheet library="default" name="css/layout.css"  />
     
    </h:head>
     
    <h:body id="theBody">
     
    	<div id="page">
    		<!-- La div avec le id= header, Represente le header  -->
       		<div id="header">
        		<ui:insert name="header" >
    	 			<ui:include src="/WEB-INF/templates/header.xhtml" />
    	        </ui:insert>
       		</div>
     
    		<!-- La div avec le id= content, Represente le contenu spécifique à chaque vue  --> 
    		<div id="content">
    			<ui:insert name="content" >
    				<ui:include src="/WEB-INF/templates/content.xhtml" />
    			</ui:insert>
    		</div>
     
    		<!-- La div avec le id= footer, Represente le contenu spécifique au pied de page par défaut  -->     
    		<div id="footer">
    			<ui:insert name="footer" >
    				<ui:include src="/WEB-INF/templates/footer.xhtml"/>
    			</ui:insert>
    		</div>
    	</div>
     
    </h:body>
    <h:outputScript library="default" name="/javascript/Resources/dynamsoft.webtwain.initiate.js" target="body"/>
    	<h:outputScript library="default" name="/javascript/Resources/dynamsoft.webtwain.config.js" target="body"/>
    	<h:outputScript library="default" name="/javascript/piloteScan.js" target="body"/>
    	<h:outputScript library="default" name="/javascript/fonctionsSpec.js" target="body"/>
    </html>
    La page utilisant le layout :

    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
     
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml"
          xmlns:h="http://java.sun.com/jsf/html"
          xmlns:f="http://java.sun.com/jsf/core"
          xmlns:ui="http://java.sun.com/jsf/facelets">
     
    	<!-- Utilisation du layout principal  -->
    	<ui:composition template="/WEB-INF/templates/layout.xhtml">
    		<!-- Redefinition de la zone 'content' du layout  -->
    		<ui:define name="content">
    			<h:panelGroup id="panCentre" layout="block">
    				<ui:include src="#{navigationNouvelleDemandeMB.page}.xhtml" />	
    			</h:panelGroup>
    	   	</ui:define>
    	</ui:composition> 		
    </html>
    La "portion" que j'inclus à l'ouverture de ma page (pas de problème ici):
    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
     
    <ui:composition xmlns="http://www.w3.org/1999/xhtml"
     	xmlns:h="http://java.sun.com/jsf/html"
       	xmlns:f="http://java.sun.com/jsf/core"
       	xmlns:p="http://primefaces.org/ui"
       	xmlns:ui="http://java.sun.com/jsf/facelets"> 
     
    	<p:layout fullPage="false" style="height: 600px;">
       		<p:layoutUnit position="center">
       			<h:form id="formChoixDemandeur">
       				<p:panel id="panChoixDemandeur" style="height:315px;" >
       					<p:commandLink id="versPage2" update=":panCentre" actionListener="#{nouvelleDemande.onSelectParticulier}">
              				<h:outputText value="vers page suivante" />
        				</p:commandLink>
       				</p:panel>
       			</h:form>
       		</p:layoutUnit>
       		<p:layoutUnit position="south">
       			en bas
       		</p:layoutUnit>
     	</p:layout>
     </ui:composition>
    et enfin, je voudrais remplacer le "content" de ma page principale par celui ci, et c'est la que la <div> me pose un problème :
    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
     
    <ui:composition xmlns="http://www.w3.org/1999/xhtml"
     	xmlns:h="http://java.sun.com/jsf/html"
       	xmlns:f="http://java.sun.com/jsf/core"
       	xmlns:p="http://primefaces.org/ui"
       	xmlns:ui="http://java.sun.com/jsf/facelets"> 
     
    	<p:layout fullPage="false" style="height: 600px;">
         		<p:layoutUnit position="west" size="35%">
       			<h:form id="formScanner"> 
       				<p:panelGrid id="panGauche" styleClass="sansgrille">
           	   			<p:row>
                			<p:column>
                				<p:commandLink title="Numériser" oncomplete="AcquireImage();">
                					<h:graphicImage library ="default" name="/images/icones/scanner.png"/>
                				</p:commandLink>
                			</p:column>
                			<p:column>
                				<p:commandLink actionListener="#{nouvelleDemande.getFileName()}" title="ajouter" oncomplete="ftpUpload(xhr, status, args);" >
                					<h:graphicImage library ="default" name="/images/icones/telecharger.png"/>
                				</p:commandLink>
                			</p:column>
                			<p:column>
                				<p:commandLink title="Effacer" oncomplete="clearImages">
                					<h:graphicImage library ="default" name="/images/icones/corbeille.png"/>
                				</p:commandLink>
                			</p:column>
            			</p:row>
            			<p:row>
           	   				<p:column colspan="3">
     
           	   				<div id="dwtcontrolContainer"/> // LE PROBLEME
     
           	   				</p:column>
           	   			</p:row>
           	   		</p:panelGrid>
     			</h:form>
           	</p:layoutUnit>
    (..............)
    et enfin, un extrait du bean :
    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
     
    @ManagedBean(name = "navigationNouvelleDemandeMB")
    @ViewScoped
    public class nouvelleDemandeNavigationManagedBean implements Serializable {
     
    	private static final long	serialVersionUID	= 1L;
    	private String						page							= "/WEB-INF/includesPages/all/IncludeNewDemandeAccueil";
     
    	public String getPage() {
    		return page;
    	}
     
    	public void setPage(String page) {
    		this.page = page;
     
    	}
    }
    J'ai tenté de remplacer la <div> par un <h:panelGroup layout="block"> mais sans succès.
    Navré pour la taille du message mais j'ai essayé de mettre un maximum de détails pour essayer d'expliquer au mieux mon problème.
    D'avance merci pour tous vos conseils.

  4. #4
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ca n'a pas de sens de mettre ton div avec un id fixe là. Tu es dans une structure répétitive (panelGrid), donc ton div sera généré N fois. Or il ne peut y avoir qu'un seul tag html ave un id donnée dans une page web générée.

    Pour le reste, tu ne peux pas mettre de html directement dans un tag column, tu dois le wrapper dans un panelGroup par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <h:panelGroup>
     <div id="dwtcontrolContainer"/>
    </h:panelGroup>
    Mais ça ne va de toute façon pas te servir car ton framework qui en a besoin va se casser le dents en se rendant compte qu'il y en a plusieurs.

Discussions similaires

  1. JPA héritage complexe ?
    Par michok34 dans le forum JPA
    Réponses: 10
    Dernier message: 07/01/2011, 16h34
  2. Héritage avec JPA
    Par le2tbomi dans le forum JPA
    Réponses: 1
    Dernier message: 04/10/2010, 15h02
  3. Stratégies de mapping d'héritage avec Hibernate / JPA
    Par Ricky81 dans le forum Persistance des données
    Réponses: 10
    Dernier message: 21/06/2010, 11h58
  4. Réponses: 0
    Dernier message: 04/10/2009, 16h19
  5. JPA héritage "en cascade"
    Par DrumCode dans le forum JPA
    Réponses: 2
    Dernier message: 14/10/2008, 11h37

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