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

Hibernate Java Discussion :

Enregistrer dans la table d'association - ManyToMany avec clause where


Sujet :

Hibernate Java

  1. #1
    Membre régulier
    Étudiant
    Inscrit en
    avril 2009
    Messages
    169
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2009
    Messages : 169
    Points : 78
    Points
    78
    Par défaut Enregistrer dans la table d'association - ManyToMany avec clause where
    Bonjour,

    J'aurais besoin de votre aide pour savoir si mon cas est faisable avec Hibernate 5.1

    Contexte
    Un article possède des SegmentsClassification et des Composants.
    Un Composant est exactement un SegmentClassification mais de type 9.
    La liste des segmentclassification dans Article sont les SegmentsClassification de type 1.

    Lorsque je charge un Article avec Hibernate,
    • la liste des segmentClassification est bien rempli avec ses SegmentsClassification dont le type est 1
    • la liste des composants est bien rempli avec ses SegmentsClassification dont le type est 9



    Classes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @Entity
    public class Article implements Serializable
    {
    	private Long id; 
    	private Set<SegmentClassification> segmentsClassification = new LinkedHashSet<SegmentClassification>();
    	private Set<SegmentClassification> composants = new LinkedHashSet<>();
    	...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    @Entity
    public class SegmentClassification implements Serializable
    {
    	private Long id;

    Mapping

    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
     
    <class name="Article" table="DDB_PRD_ARTI">
     
    		<id name="id" type="long" column="ID" unsaved-value="null">
    			<generator class="org.hibernate.id.enhanced.SequenceStyleGenerator">
    				<param name="sequence_name">SEQ_ARTI</param>
    				<param name="optimizer">none</param>
    			</generator>
    		</id>
     
    		<set name="segmentsClassification" cascade="none" table="DDB_PRD_ARSG" access="field" fetch="select" where="ARSG_IS_COMPOSANT=1">
    			<key column="ARSG_ID_ARTI" not-null="true" foreign-key="FK_ARSG_CLSG" />
    			<many-to-many class="fr.pgih.ref.ddb.prd.quartier.classification.generique.domaine.SegmentClassification" column="ARSG_ID_CLSG" foreign-key="FK_ARSG_ARTI" />
    		</set>
     
    		<set name="composants" cascade="none" table="DDB_PRD_ARSG" access="field" fetch="select" where="ARSG_IS_COMPOSANT=9">
    			<key column="ARSG_ID_ARTI" not-null="true" foreign-key="FK_ARSG_CLSG" />
    			<many-to-many class="fr.pgih.ref.ddb.prd.quartier.classification.generique.domaine.SegmentClassification" column="ARSG_ID_CLSG" foreign-key="FK_ARSG_ARTI" />
    		</set>
                    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    <class name="SegmentClassification" table="DDB_PRD_CLSG">
     
    		<id name="id" type="long" column="ID" unsaved-value="null">
    			<generator class="org.hibernate.id.enhanced.SequenceStyleGenerator">
    				<param name="sequence_name">SEQ_CLSG</param>
    				<param name="optimizer">none</param>
    			</generator>
    		</id>
                    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <class name="ArticleSegClassif" table="DDB_PRD_ARSG">
     
    		<!-- Identifiant avec cles composites -->
    		<composite-id name="id" class="ArticleSegClassifId">
    			<key-property name="idArticle" column="ARSG_ID_ARTI" />
    			<key-property name="idSegClassif" column="ARSG_ID_CLSG" />
    		</composite-id>
     
    		<property name="isComposant">
    			<column name="ARSG_IS_COMPOSANT">
    			</column>
    		</property>
    Problème

    Je rajoute un composant à la liste des composants de l'article.
    Comment je peux faire pour que, à la l'enregistrement de l'article, Hibernate fasse un insert en base dans la table d'association (DDB_PRD_ARSG) avec le renseigné (exemple type = 9) ?
    Actuellement Hibernate fait bien l'insert mais le type n'est pas renseigné. La table d'association contient uniquement l'id de DDB_PRD_ARTI et l'id de DDB_PRD_CLSG.
    Je voudrais éviter de coder le store via Hibernate dans la table d'association pour mettre le type à 9 ou à un autre nombre. Si Hibernate est capable de charger les éléments en fonction de la clause where, je me dis que peu être il est capable de faire la différence lors de l'enregistrement et donc Hibernate renseigne tout seul le type à 9 ou à 1.

  2. #2
    Membre régulier
    Étudiant
    Inscrit en
    avril 2009
    Messages
    169
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : avril 2009
    Messages : 169
    Points : 78
    Points
    78
    Par défaut
    Bonjour,

    Après plusieurs test j'ai trouvé la réponse à ma question :
    • il faut ajouter la clause where dans le mapping + fetch=select
    • ajouter la balise <sql-insert> en précisant la valeur du "discriminant"


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
                 <set name="segmentsClassification" cascade="none" table="DDB_PRD_ARSG" access="field"  fetch="select" where="ARSG_TYPE != 'COMPOSANT'" >
    			<key column="ARSG_ID_ARTI" not-null="true" foreign-key="FK_ARSG_CLSG" />
    			<many-to-many class="fr.pgih.ref.ddb.prd.quartier.classification.generique.domaine.SegmentClassification" column="ARSG_ID_CLSG" foreign-key="FK_ARSG_ARTI"/>
                            <sql-insert>insert into DDB_PRD_ARSG(ARSG_ID_ARTI, ARSG_ID_CLSG, ARSG_TYPE) values (?, ?,  'CLASSIF')</sql-insert>
    		</set>
    		<set name="composants" cascade="none" table="DDB_PRD_ARSG" access="field" fetch="select" where="ARSG_TYPE = 'COMPOSANT'">
    			<key column="ARSG_ID_ARTI" not-null="true" foreign-key="FK_ARSG_CLSG" />
    			<many-to-many class="fr.pgih.ref.ddb.prd.quartier.classification.generique.domaine.SegmentClassification" column="ARSG_ID_CLSG" foreign-key="FK_ARSG_ARTI"/>
                            <sql-insert>insert into DDB_PRD_ARSG(ARSG_ID_ARTI, ARSG_ID_CLSG, ARSG_TYPE) values (?, ?, 'COMPOSANT')</sql-insert>
    		</set>
    Hibernate gèrera seul la suppression, l'insert et l'update.

    L'inconvénient de cette solution est qu'il y aura 2 appels à la vase de données pour récupérer segmentsClassification et composants.

    Une autre solution, différente de celle là et plus performante, serait de faire un seul appel pour remonter tous les DDB_PRD_ARSG puis une fois côté Java dispatcher en 2 listes en fonction de ARSG_TYPE. Avec cette autre solution, il y a unseul appel à la BDD.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 02/05/2009, 17h56
  2. Réponses: 2
    Dernier message: 27/04/2009, 23h01
  3. [AC-2003] Rendre un enregistrement dans une table associée obligatoire ?
    Par marot_r dans le forum Modélisation
    Réponses: 4
    Dernier message: 31/03/2009, 21h53
  4. [SQL] Problème avec nombre d'enregistrements dans une table
    Par zana74 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 14/08/2006, 13h28
  5. Problème avec nombre d'enregistrements dans une table
    Par zana74 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/08/2006, 13h21

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