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 :

Remplir tous les enfants d'une entité


Sujet :

JPA Java

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    janvier 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : janvier 2005
    Messages : 49
    Points : 44
    Points
    44
    Par défaut Remplir tous les enfants d'une entité
    Bonjour,

    J'ai une classe MenuItemLite.
    Dans cette entité, j'ai les champs suivants :

    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
     
     
    public class MenuItemLite extends BaseObject<Long> {
     
    @Id
    @Column(name = "ID")
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_IS_MENU_ITEM_LITE_GEN")
    private Long id;
     
    /** Parent menu element. Every menu element has one, except the root element */
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "PARENT_ID")
    private MenuItemLite parent;
     
    /** First level children of this menu element */
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "parent", fetch = FetchType.EAGER)
    @OrderBy("sortOrder ASC")
    private List<MenuItemLite> children;
     
    /** the name of this menu item (usually needed for Root menu item) */
    @Column(name = "NAME")
    private String name;
     
    ...
    }
    Je voudrais que tous les "children" du menu dont j'ai l'id soient remplis ("fétchés") dans ma liste List<MenuItemLite> children.

    Ainsi, par exemple, si j'ai

    id name parent
    1 racine null
    5 elementA 1
    10 elementB 1
    12 elementBA 10

    L'objet racine MenuItemLite retourné aura une liste de children comportant 2 éléments.
    Parmi ces 2 éléments, l'objet MenuItemLite dont le nom est "elementB" aura une liste de children d'un seul élément : l'objet MenuItemLite dont le name est elementBA.

    Est-ce possible en jpa ?

  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 : 41
    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 810
    Points
    48 810
    Par défaut
    a priori, je dirais que c'est déjà ce que fait ton code. Quel que soit l'élément que tu récupère, tout l'arbre viens avec, via les children / parent que tu as mis en eager.

    A noter que c'est une mauvais pratique, ça reviens récupérer à chaque fois toute ta base de données

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    janvier 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : janvier 2005
    Messages : 49
    Points : 44
    Points
    44
    Par défaut
    Je pensais que ça le faisait, mais ça ne le fait que pour les children de l'élément racine. Les autres listes de children restent à null

  4. #4
    Membre expert
    Homme Profil pro
    Inscrit en
    septembre 2006
    Messages
    2 729
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : septembre 2006
    Messages : 2 729
    Points : 3 859
    Points
    3 859
    Par défaut
    Montrez le code qui charge la racine
    Activez les logs SQL pour vérifier les requêtes exécutées et postez-les ici

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    janvier 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : janvier 2005
    Messages : 49
    Points : 44
    Points
    44
    Par défaut
    Code éxécuté (openjpa) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MenuItemLite object = em.find(MenuItemLite.class, id);
    SELECT t0.CREATION_DATE
    ,t0.MODIFICATION_DATE
    ,t0.AUTO_SPLIT
    ,t0.CRITERIA_ID
    ,t0.DESTINATION_LINK_ID
    ,t0.DISPLAY_CONTENT_IN_MENU
    ,t1.ID
    ,t1.CREATION_DATE
    ,t1.MODIFICATION_DATE
    ,t1.NAME
    ,t0.EFFECTIVE_DT
    ,t0.END_DT
    ,t0.ICON_NAME
    ,t0.IS_COUNTER_ACTIVE
    ,t0.ITEM_GENERATOR_PARAMS
    ,t2.ID
    ,t2.CREATION_DATE
    ,t2.MODIFICATION_DATE
    ,t2.active
    ,t2.CODE
    ,t2.NAME
    ,t3.ID
    ,t3.CREATION_DATE
    ,t3.MODIFICATION_DATE
    ,t3.active
    ,t3.CODE
    ,t3.NAME
    ,t3.SUPPORT_ENCRYPTION
    ,t3.VSD_PLATFORM_ID
    ,t2.SUPPORT_ENCRYPTION
    ,t2.VSD_PLATFORM_ID
    ,t0.REQUIRES_LOGIN
    ,t4.ID
    ,t4.CREATION_DATE
    ,t4.MODIFICATION_DATE
    ,t4.CLASS_NAME
    ,t4.NAME
    ,t4.INCLUDE_PROV_TYPES_PARAMETER
    ,t4.LINEAR_FEED_ICON_PARAMETER
    ,t4.MENU_PARAMETER
    ,t4.NUMBER_OF_COLUMNS_PARAMETER
    ,t4.PROVIDER_PARAMETER
    ,t0.NAME
    ,t5.ID
    ,t5.CREATION_DATE
    ,t5.MODIFICATION_DATE
    ,t5.AUTO_SPLIT
    ,t5.CRITERIA_ID
    ,t5.DESTINATION_LINK_ID
    ,t5.DISPLAY_CONTENT_IN_MENU
    ,t5.DISPLAY_MODEL_ID
    ,t5.EFFECTIVE_DT
    ,t5.END_DT
    ,t5.ICON_NAME
    ,t5.IS_COUNTER_ACTIVE
    ,t5.ITEM_GENERATOR_PARAMS
    ,t5.PLATFORM_ID
    ,t5.REQUIRES_LOGIN
    ,t5.MENU_GENERATOR_ID
    ,t5.NAME
    ,t5.PARENTAL_CONTROL
    ,t5.PROVIDER_ID
    ,t5.PROVIDER_TYPE_ID
    ,t5.SORT_ORDER
    ,t5.SORT_TYPE_ID
    ,t5.STOREFRONT_ID
    ,t5.TOPIC_NAME
    ,t5.MENU_ITEM_TYPE_ID
    ,t5.VISIBLE
    ,t0.PARENTAL_CONTROL
    ,t0.PROVIDER_ID
    ,t6.ID
    ,t6.CREATION_DATE
    ,t6.MODIFICATION_DATE
    ,t6.CODE
    ,t6.NAME
    ,t0.SORT_ORDER
    ,t7.ID
    ,t7.CREATION_DATE
    ,t7.MODIFICATION_DATE
    ,t7.NAME
    ,t8.ID
    ,t8.NAME
    ,t9.ID
    ,t9.CODE
    ,t9.DEFINITION
    ,t9.NAME
    ,t9.QUANTITY
    ,t0.TOPIC_NAME
    ,t10.ID
    ,t10.CREATION_DATE
    ,t10.MODIFICATION_DATE
    ,t10.NAME
    ,t0.VISIBLE
    ,t11.PARENT_ID
    ,t11.ID
    ,t11.CREATION_DATE
    ,t11.MODIFICATION_DATE
    ,t11.AUTO_SPLIT
    ,t11.CRITERIA_ID
    ,t11.DESTINATION_LINK_ID
    ,t11.DISPLAY_CONTENT_IN_MENU
    ,t11.DISPLAY_MODEL_ID
    ,t11.EFFECTIVE_DT
    ,t11.END_DT
    ,t11.ICON_NAME
    ,t11.IS_COUNTER_ACTIVE
    ,t11.ITEM_GENERATOR_PARAMS
    ,t11.PLATFORM_ID
    ,t11.REQUIRES_LOGIN
    ,t11.MENU_GENERATOR_ID
    ,t11.NAME
    ,t11.PARENTAL_CONTROL
    ,t11.PROVIDER_ID
    ,t11.PROVIDER_TYPE_ID
    ,t11.SORT_ORDER
    ,t11.SORT_TYPE_ID
    ,t11.STOREFRONT_ID
    ,t11.TOPIC_NAME
    ,t11.MENU_ITEM_TYPE_ID
    ,t11.VISIBLE
    FROM IS_MENU_ITEM t0
    ,IS_DISPLAY_MODEL t1
    ,IS_PLATFORM t2
    ,IS_PLATFORM t3
    ,IS_MENU_GENERATOR_TYPE t4
    ,IS_MENU_ITEM t5
    ,IS_PROVIDER_TYPE t6
    ,IS_SORT_TYPE t7
    ,IS_STOREFRONT t8
    ,IS_WIDGET t9
    ,IS_MENU_ITEM_TYPE t10
    ,IS_MENU_ITEM t11
    WHERE t0.ID = ?
    AND t0.DISPLAY_MODEL_ID = t1.ID(+)
    AND t0.PLATFORM_ID = t2.ID(+)
    AND t0.MENU_GENERATOR_ID = t4.ID(+)
    AND t0.PARENT_ID = t5.ID(+)
    AND t0.PROVIDER_TYPE_ID = t6.ID(+)
    AND t0.SORT_TYPE_ID = t7.ID(+)
    AND t0.STOREFRONT_ID = t8.ID(+)
    AND t0.MENU_ITEM_TYPE_ID = t10.ID(+)
    AND t0.ID = t11.PARENT_ID(+)
    AND t2.PARENT_ID = t3.ID(+)
    AND t8.WIDGET_ID = t9.ID(+)
    ORDER BY t11.PARENT_ID ASC
    ,t11.SORT_ORDER ASC [params=(long) 9581]
    Une bonne grosse requête, mais qui ne va pas loin.

  6. #6
    Membre expert
    Homme Profil pro
    Inscrit en
    septembre 2006
    Messages
    2 729
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : septembre 2006
    Messages : 2 729
    Points : 3 859
    Points
    3 859
    Par défaut
    Jusque là pas de problème, la racine est chargée correctement...

    Maintenant quand vous naviguez dans le modèle en accédant aux "children", normalement le même query doit être exécuté pour chaque instance de "children" à laquelle vous accédez...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    janvier 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : janvier 2005
    Messages : 49
    Points : 44
    Points
    44
    Par défaut
    Elle n'est exécutée qu'une fois.

    Bon, j'ai contourné le problème en changeant la requête et en finissant le travail en Java :

    Requête QUERY_TEST_CHILDREN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM is_menu_item START WITH id = ?1 CONNECT BY PRIOR ID = PARENT_ID order by parent_id desc
    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
     
    TypedQuery<MenuItemLite> query2 = getEntityManager().createNamedQuery(MenuItemLite.QUERY_TEST_CHILDREN, MenuItemLite.class).setParameter(1, menuId.toString());
    List<MenuItemLite> lstMenuItem = query2.getResultList();
     
    for (MenuItemLite menuItem : lstMenuItem) {
    	return getMenuChildren2(menuItem);
    }
     
    private MenuItemLite getMenuChildren2(MenuItemLite menuItem) {
    	for (MenuItemLite menuItemI : menuItem.getChildren()) {
    		menuItemI.setChildren(getChildrenMenu2(menuItemI));
    	}
     
    	return menuItem;
    }
     
    private List<MenuItemLite> getChildrenMenu2(MenuItemLite menuParent) {
     
            for (MenuItemLite menuItemI : menuParent.getChildren()) {
    	       menuItemI.setChildren(getChildrenMenu(menuItemI));
    	}
    	return menuParent.getChildren();
    }

  8. #8
    Membre expert
    Homme Profil pro
    Inscrit en
    septembre 2006
    Messages
    2 729
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : septembre 2006
    Messages : 2 729
    Points : 3 859
    Points
    3 859
    Par défaut
    Citation Envoyé par elias Voir le message
    Elle n'est exécutée qu'une fois.
    C'est bien là le problème...
    vous avez certainement un problème de config OpenJPA : le chargement des objets doit se faire lorsque vous parcourez la liste, toute cette structure doit être "proxifiée"... tout se passe comme si OpenJPA n'avait pas instrumenter votre code... auriez-vous activé le load time weaving et oublié de passer le weaver en paramètre de lancement de la JVM?

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    janvier 2005
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : janvier 2005
    Messages : 49
    Points : 44
    Points
    44
    Par défaut
    Wow, désolé, mais je ne comprends pas de quoi vous parlez.

Discussions similaires

  1. Réponses: 14
    Dernier message: 17/10/2005, 09h41
  2. afficher tous les champs d'une table
    Par julio84 dans le forum ASP
    Réponses: 8
    Dernier message: 19/01/2005, 10h31
  3. Retrouver tous les champs d'une table
    Par tripper.dim dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/07/2004, 20h40
  4. Afficher tous les champs d'une table avec dbexpress et MySQL
    Par LHT dans le forum Bases de données
    Réponses: 2
    Dernier message: 25/06/2004, 17h11
  5. Envoie d'un message a TOUS les composant d'une form
    Par chddv dans le forum Composants VCL
    Réponses: 7
    Dernier message: 15/09/2003, 09h47

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