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

NHibernate Discussion :

[NHibernate] One-to-many, demande de vérification


Sujet :

NHibernate

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Novembre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2009
    Messages : 61
    Par défaut [NHibernate] One-to-many, demande de vérification
    Bonjour,

    Je voudrais savoir si ce que j'ai fais est correct, surtout au niveau de l'ajout des données. Ça fonctionne mais je suis pas sur que ce soit la bonne méthode.

    C'est un application console, je n'ai pas fais de bibliothèque de classes, de repositories et d'interface (c'est un peu à la sauvage...mais bon)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Users
        {
            public virtual int user_Id { get; private set; }
            public virtual string user_Name { get; set; }
            public virtual string user_Sex { get; set; }
            public virtual IList<Phones> phone { get; set; }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     public class Phones
        {
            public virtual int phone_Id { get; private set; }
            public virtual string phone_Number { get; set; }
            public virtual DateTime phone_Date { get; set; }
            public virtual Users user { get; set; }
        }
    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
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                       namespace="ConsoleNhibernate.Mappings"
                       assembly="ConsoleNhibernate">
     
      <class name="Users" table="Users">
        <id name="user_Id" column="User_Id">
          <generator class="identity"/>
        </id>
     
        <property name="user_Name" column="User_Name"/>
        <property name="user_Sex"  column="User_Sex"/>
     
        <bag name="phone" cascade="all-delete-orphan" lazy="false">
          <key column="User_Id"  not-null="true"/>
          <one-to-many class="Phones"/>
        </bag>
     
      </class>
    </hibernate-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
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                       namespace="ConsoleNhibernate.Mappings"
                       assembly="ConsoleNhibernate">
     
      <class name="Phones" table="Phones">
        <id name="phone_Id" column="Phone_Id">
          <generator class="identity"/>
        </id>
     
        <property name="phone_Number" column="Phone_Number"/>
        <property name="phone_Date" type="timestamp" column="Phone_Date"/>
     
        <many-to-one name="user" class="Users" column="User_Id" cascade="none" not-null="true"/>
      </class>
    </hibernate-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
    Users classUser = new Users()
                    {
                        user_Name = "toto",
                        user_Sex = "M"
     
                    };
     
                    Phones phone = new Phones()
                    {
                        phone_Number = "06 06 06 06 06",
                        phone_Date = DateTime.Now,
                        user = classUser                    
                    };
     
                    insertItemUsers(classUser);
                    insertItemPhones(phone);
    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
     private static void insertItemUsers(Users user)
            {
     
     
                using (ISession session = hibernateHelper.OpenSession())
                {
                    using (ITransaction transaction = session.BeginTransaction())
                    {
                        session.Save(user);
                        transaction.Commit();
                    }
                }   
            }
     
            private static void insertItemPhones(Phones phone)
            {
     
     
                using (ISession session = hibernateHelper.OpenSession())
                {
                    using (ITransaction transaction = session.BeginTransaction())
                    {
                        session.Save(phone);
                        transaction.Commit();
                    }
                }
            }
    Merci de m'aider.

  2. #2
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Dans le fond c'est bon avec juste une petite remarque :
    Les associations n'ont pas systèmatiquement besoin d'être explicites, mais si tu souhaites associer le user dans le phone, autant que ce soit le save du phone qui vérifie l'intégrité du user, et donc d'utiliser le save-update.

    Surtout que là comme tu débranches le lazy loading, chaque user va avoir sa liste phone qui va avoir son user, qui va avoir sa liste de phone.Bref, ça va droit au select n+1.

    surtout que dans ce que tu as fait, tu sauves les deux dans deux transactions différentes, ce qui n'est pas terrible.

    Faire une méthode pour sauver le user et le phone est redondant, donc tu peux factoriser.

    utiliser des id native va te provoquer des hits inutiles pour obtenir un id, ce serait cependant utile de spécifier un "unsaved value".

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public class Users
        {
            public virtual int user_Id { get; private set; }
            public virtual string user_Name { get; set; }
            public virtual string user_Sex { get; set; }
            public virtual IList<Phones> phone { get; set; }
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     public class Phones
        {
            public virtual int phone_Id { get; private set; }
            public virtual string phone_Number { get; set; }
            public virtual DateTime phone_Date { get; set; }
            public virtual Users user { get; set; }
        }
    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
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                       namespace="ConsoleNhibernate.Mappings"
                       assembly="ConsoleNhibernate">
     
      <class name="Users" table="Users">
        <id name="user_Id" column="User_Id">
          <generator class="identity"/>
        </id>
     
        <property name="user_Name" column="User_Name"/>
        <property name="user_Sex"  column="User_Sex"/>
     
        <bag name="phone" cascade="all-delete-orphan" lazy="false">
          <key column="User_Id"  not-null="true"/>
          <one-to-many class="Phones"/>
        </bag>
     
      </class>
    </hibernate-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
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                       namespace="ConsoleNhibernate.Mappings"
                       assembly="ConsoleNhibernate">
      
      <class name="Phones" table="Phones">
        <id name="phone_Id" column="Phone_Id">
          <generator class="identity"/>
        </id>
    
        <property name="phone_Number" column="Phone_Number"/>
        <property name="phone_Date" type="timestamp" column="Phone_Date"/>
    
        <many-to-one name="user" class="Users" column="User_Id" cascade="save-update" not-null="true"/>
      </class>
    </hibernate-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
    Users classUser = new Users()
                    {
                        user_Name = "toto",
                        user_Sex = "M"
     
                    };
     
                    Phones phone = new Phones()
                    {
                        phone_Number = "06 06 06 06 06",
                        phone_Date = DateTime.Now,
                        user = classUser                    
                    };
     
                    insertItem(phone);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
            private static void insertItem(Object item)
            {
     
     
                using (ISession session = hibernateHelper.OpenSession())
                {
                    using (ITransaction transaction = session.BeginTransaction())
                    {
                        session.SaveOrUpdate(item);
                        transaction.Commit();
                    }
                }
            }
    Merci de m'aider.[/QUOTE]

  3. #3
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Novembre 2009
    Messages
    61
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2009
    Messages : 61
    Par défaut
    Bonsoir B.AF,

    Merci beaucoup pour ton aide, NHibernate est quand même complexe avec beaucoup de propriétés que j'ai du mal à assimiler pour le moment, je fais pas mal de conneries, mais bon c'est formateur.

    J'ai modifié les 2 fichiers de 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
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                       namespace="ConsoleNhibernate.Models.BO"
                       assembly="ConsoleNhibernate">
      
      <class name="Phones" table="Phones" lazy="true">
        <id name="phone_Id" column="Phone_Id" unsaved-value="0">
          <generator class="identity"/>
        </id>
    
        <property name="phone_Number" column="Phone_Number"/>
        <property name="phone_Date" type="timestamp" column="Phone_Date"/>
        <many-to-one name="user" class="Users" column="User_Id" cascade="save-update" not-null="true"/> 
      </class>
      
    </hibernate-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
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                       namespace="ConsoleNhibernate.Models.BO"
                       assembly="ConsoleNhibernate">
    
      <class name="Users" table="Users" lazy="true">
        <id name="user_Id" column="User_Id" unsaved-value="0">
          <generator class="identity"/>
        </id>
    
        <property name="user_Name" column="User_Name"/>
        <property name="user_Sex"  column="User_Sex"/>
    
        <bag name="phone" cascade="all-delete-orphan">
          <key column="User_Id"  not-null="true"/>
          <one-to-many class="Phones"/>
        </bag>
        
      </class>
    </hibernate-mapping>
    Demain je vais factoriser les méthodes (save).

    Merci pout ton aide, à bientôt

  4. #4
    Membre extrêmement actif
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 273
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 273
    Par défaut
    Bon courage

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

Discussions similaires

  1. [NHibernate] problème de relation one-to-many
    Par Spikuria dans le forum NHibernate
    Réponses: 1
    Dernier message: 30/04/2009, 14h22
  2. [Hibernate] Relation one to many
    Par BRAUKRIS dans le forum Hibernate
    Réponses: 2
    Dernier message: 23/08/2006, 11h51
  3. [hibernate] one-to-many et clé etrangère
    Par K-Kaï dans le forum Hibernate
    Réponses: 27
    Dernier message: 18/05/2006, 10h46
  4. [hibernate] relation one-to-many avec plusieurs clés
    Par seb_fou dans le forum Hibernate
    Réponses: 6
    Dernier message: 16/03/2006, 14h47
  5. [EJB2.1 Entity] [CMR] Relation One to Many
    Par hamed dans le forum Java EE
    Réponses: 2
    Dernier message: 31/12/2003, 14h26

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