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 :

Objets Enfants non chargés


Sujet :

NHibernate

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Architecte technique
    Inscrit en
    Avril 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2012
    Messages : 3
    Points : 5
    Points
    5
    Par défaut Objets Enfants non chargés
    Bonjour,

    Je cherche à apprendre à manipuler SPRING.NET et NHibernate pour accéder aux
    données et faire de l'inversion de contrôle.

    J'essaie d'écrire une petite application example pour faire tester une relation
    one-to-many.

    Très simplement, je dispose des éléments suivants :
    • au niveau modèle, une classe Server et une classe Tomcat.
    • au niveau DAO, trois classes HibernateDao, HibernateServerDao et HibernateTomcatDao
    • au niveau service, je ne dispose que d'une classe InventoryTool


    Les fichiers de mappings sont les suivants :
    Pour la classe Serveur :
    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
     
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="Sgcib.Market.Inventory.Light.Model.Impl.Server,Sgcib.Market.Inventory.Light" table="Server" lazy="false">
    <id name="Id" type="String" unsaved-value="null">
    <column name="Name" length="200" sql-type="nchar" not-null="true" unique="true"/>
    </id>
    <property name="Os" type="String">
    <column name="OperatingSystem" length="200" sql-type="nvarchar" not-null="false"/>
    </property>
    <property name="Arch" type="String">
    <column name="Platform" length="200" sql-type="nvarchar" not-null="false"/>
    </property>
    <bag name="Tomcats" lazy="false" cascade="all-delete-orphan">
    <key column="ServerName" not-null="true"/>
    <one-to-many class="Sgcib.Market.Inventory.Light.Model.Impl.Tomcat,Sgcib.Market.Inventory.Light" />
    </bag>
    </class>
    </hibernate-mapping>
    Pour la classe Tomcat :
    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
     
    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
    <class name="Sgcib.Market.Inventory.Light.Model.Impl.Tomcat,Sgcib.Market.Inventory.Light" table="Tomcat" lazy="false">
    <id name="Id" column="Id" type="int">
    <generator class="native" />
    </id>
    <property name="Name" type="string">
    <column name="Name" length="200" sql-type="nvarcher" not-null="true"/>
    </property>
    <property name="Version" type="string">
    <column name="Version" length="200" sql-type="nvarchar" not-null="true"/>
    </property>
    </class>
    </hibernate-mapping>
    La définition de la base est la suivante :
    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
     
    CREATE TABLE SERVER (
    		Name VARCHAR(200) NOT NULL,
    		OperatingSystem VARCHAR(200) NOT NULL,
    		Platform VARCHAR(200) NOT NULL,
    		PRIMARY KEY (Name)
    )ENGINE=InnoDB;
     
    CREATE TABLE TOMCAT (
    		Id INT NOT NULL AUTO_INCREMENT,
    		Name VARCHAR(200) NOT NULL,
    		Version VARCHAR(200) NOT NULL,
    		ServerName VARCHAR(200) NOT NULL,
    		PRIMARY KEY (Id)) ENGINE=InnoDB;
     
    ALTER TABLE TOMCAT
    ADD CONSTRAINT FK_SERVERNAME 
    FOREIGN KEY (ServerName) REFERENCES Server(Name) 
    ON UPDATE CASCADE 
    ON DELETE CASCADE;
    le code de la classe server est :
    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
     
    My Server class is simple : 
     
    public class Server : IServer
    {
    private static readonly ILog LOG = LogManager.GetLogger(typeof(Server));
     
    #region Properties
    public String Id
    {
    get;
    set;
    }
    public String Os
    {
    get;
    set;
    }
    public String Arch
    {
    get;
    set;
    }
     
    public IList<Tomcat> Tomcats
    {
    set;
    get;
    }
     
    #endregion
     
    #region Contructor (s)
     
    public Server()
    {
     
    }
     
    public Server(String Id, String Os, String Arch)
    {
    this.Id = Id;
    this.Os = Os;
    this.Arch = Arch;
    this.Tomcats = new List<Tomcat>();
    }
     
    #endregion
    }
    Le code du programme principale est :

    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
     
    static void Main(string[] args)
    {
    Server srv = null;
    LOG.Info("Debut du programme principal \n");
    IApplicationContext ctx = ContextRegistry.GetContext();
    IInventoryTool invtool = (IInventoryTool)ctx.GetObject("InventoryTool");
    srv = (Server)invtool.Get("DARKVAIO");
     
    if (srv == null)
    {
    srv = new Server("Darkvaio", "Windows 7", "32bits");
    Tomcat tct1 = new Tomcat("PRD", "apache-tomcat-7.0.22");
    Tomcat tct2 = new Tomcat("DEV", "apache-tomcat-7.0.23");
    Tomcat tct3 = new Tomcat("UAT", "apache-tomcat-7.0.19");
    srv.Tomcats.Add(tct1);
    srv.Tomcats.Add(tct2);
    srv.Tomcats.Add(tct3);
    invtool.Save(srv);
    srv.Tomcats.Remove(tct2);
    invtool.SaveOrUpdate(srv);
    }
    else
    {
    srv.ToString();
    foreach (Tomcat tct in srv.Tomcats)
    {
    tct.ToString();
    LOG.Info("Hello world\n");
    }
    invtool.Delete(srv);
    }
     
    LOG.Info("Fin du programme principal \n");
    }
    voici le fichier App.config :
    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
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
     
    <?xml version="1.0"?>
    <configuration>
      <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net"/>
     
        <sectionGroup name="common">
          <section name="logging" type="Common.Logging.ConfigurationSectionHandler, Common.Logging"/>
        </sectionGroup>
     
        <sectionGroup name="spring">
          <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
          <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/>
          <section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core"/>
        </sectionGroup>
      </configSections>
     
      <spring>
        <context>
          <resource uri="config://spring/objects"/>
        </context>
        <parsers>
          <parser type="Spring.Data.config.DatabaseNamespaceParser, Spring.Data"/>
        </parsers>
     
        <objects xmlns="http://www.springframework.net" xmlns:db="http://www.springframework.net/database" xmlns:tx="http://www.springframework.net/tx">
          <description>An  example that demonstrates simple IoC features.</description>
          <db:provider id="DbProvider" provider="MySql-5.0" connectionString="Server=localhost;Database=INVENTAIRE;User ID=root;Password=tricatel;"/>
     
          <object id="MySessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate32">
            <property name="DbProvider" ref="DbProvider"/>
            <property name="MappingResources">
              <list>
                <!-- <value>assembly://Inventory/Inventory.Dao.Mappings/Binding.hbm.xml</value>
                <value>assembly://Inventory/Inventory.Dao.Mappings/Language.hbm.xml</value>
                <value>assembly://Inventory/Inventory.Dao.Mappings/Weblogic.hbm.xml</value>
                <value>assembly://Inventory/Inventory.Dao.Mappings/Iis.hbm.xml</value> -->
                <value>assembly://Sgcib.Market.Inventory.Light/Sgcib.Market.Inventory.Light.Dao.Mappings/Server.hbm.xml</value>
                <value>assembly://Sgcib.Market.Inventory.Light/Sgcib.Market.Inventory.Light.Dao.Mappings/Tomcat.hbm.xml</value>
              </list>
            </property>
     
            <property name="HibernateProperties">
              <dictionary>
                <entry key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
                <entry key="dialect" value="NHibernate.Dialect.MySQLDialect"/>
                <entry key="connection.driver_class" value="NHibernate.Driver.MySqlDataDriver"/>
                <entry key="show_sql" value="true"/>
              </dictionary>
            </property>
            <property name="ExposeTransactionAwareSessionFactory" value="true"/>
          </object>
     
          <object id="TransactionManager" type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate32">
            <property name="DbProvider" ref="DbProvider"/>
            <property name="SessionFactory" ref="MySessionFactory"/>
          </object>
     
          <!-- <object id="BindingDao" type="Sgcib.Market.Inventory.Hibernate.HibernateBindingDao,Sgcib.Market.Inventory.Light" singleton="true">
            <property name="SessionFactory" ref="MySessionFactory"/>
          </object>
     
          <object id="LanguageDao" type="Sgcib.Market.Inventory.Hibernate.HibernateLanguageDao,Sgcib.Market.Inventory.Light" singleton="true">
            <property name="SessionFactory" ref="MySessionFactory"/>
          </object> -->
     
          <object id="TomcatDao" type="Sgcib.Market.Inventory.Light.HibernateDao.HibernateTomcatDao,Sgcib.Market.Inventory.Light" singleton="true">
            <property name="SessionFactory" ref="MySessionFactory"/>
          </object>
     
          <object id="ServerDao" type="Sgcib.Market.Inventory.Light.HibernateDao.HibernateServerDao,Sgcib.Market.Inventory.Light" singleton="true">
            <property name="SessionFactory" ref="MySessionFactory"/>
          </object>
     
          <object id="InventoryTool" type="Sgcib.Market.Inventory.Light.Service.Impl.InventoryTool,Sgcib.Market.Inventory.Light" singleton="true">
            <property name="ServerDao" ref="ServerDao"/>
            <!-- <property name="TomcatDao" ref="TomcatDao"/>
            <property name="BindingDao" ref="BindingDao"/>
            <property name="LanguageDao" ref="LanguageDao"/> -->
          </object>
     
          <tx:attribute-driven transaction-manager="TransactionManager"/>
        </objects>
      </spring>
     
      <log4net>
        <appender name="Console" type="log4net.Appender.ConsoleAppender">
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%5level [%thread] (%file:%line) - %message%newline"/>
          </layout>
        </appender>
     
        <appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
          <file value="C:\Temp\InventaireLight.log"/>
          <appendToFile value="true"/>
          <maximumFileSize value="1000000KB"/>
          <maxSizeRollBackups value="2"/>
          <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%5level [%thread] %logger - %message%newline"/>
          </layout>
        </appender>
     
        <root>
          <level value="INFO"/>
          <appender-ref ref="Console"/>
          <appender-ref ref="RollingFile"/>
        </root>
     
        <logger name="Spring">
          <level value="WARN"/>
          <appender-ref ref="Console"/>
          <appender-ref ref="RollingFile"/>
        </logger>
     
        <logger name="NHibernate">
          <level value="WARN"/>
          <appender-ref ref="Console"/>
          <appender-ref ref="RollingFile"/>
        </logger>
      </log4net>
     
      <common>
        <logging>
          <factoryAdapter type="Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter, Common.Logging">
            <arg key="showLogName" value="true"/>
            <arg key="showDataTime" value="true"/>
            <arg key="level" value="WARN"/>
            <arg key="dateTimeFormat" value="yyyy/MM/dd HH:mm:ss:fff"/>
          </factoryAdapter>
        </logging>
      </common>
    <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup></configuration>

    La première fois que je lance le programme, un objet "server" est créé. Cet objet se voit rajouter trois objets "Tomcat" et est ensuite correctement sauvegardé (les 3 tomcats aussi). Je lui retire ensuite un Tomcat et je le re sauvegarde sans problème. J'ai donc une entrée dans la table Server et deux entrées dans la table Tomcat.

    La seconde fois que je lance mon programme, je récupère bien l'objet Server cependant je ne recupère pas les deux instances Tomcats associées. En activant les traces "sql" de NHibernate, je vois bien la requête sur la table Tomcat. J'ai vérifié, elle renvoie bien les deux instances mais ma liste srv.Tomcats est vide.
    Ma question est pourquoi elle est vide et que dois je faire pour corriger ceci.

    Cordialement,

    darkfiz

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Points : 1 498
    Points
    1 498
    Par défaut
    Salut,

    Toutes les propriétés de Server doivent etre en virtual pour pouvoir etre proxifiée et donc renseignées par Nhibernate.

    Cela devrait corriger ton problème.

Discussions similaires

  1. objet monthview non diponible sur certains posts
    Par karimspace dans le forum Access
    Réponses: 5
    Dernier message: 30/08/2006, 11h18
  2. [VB.net] Stocker un id dans une combo non chargée via ds ?
    Par RiiiDD dans le forum Windows Forms
    Réponses: 6
    Dernier message: 07/04/2006, 11h21
  3. [classpath]classpath non chargé depuis le jar, le système,..
    Par Grummfy dans le forum Général Java
    Réponses: 5
    Dernier message: 12/01/2006, 17h28
  4. VB6 - connaître si un objet Form est chargé en mode MODAL
    Par CBleu dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 04/01/2006, 21h16
  5. "Mixer" objet et non-objet ?
    Par zapho dans le forum UML
    Réponses: 5
    Dernier message: 19/03/2004, 14h43

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