Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Invité de passage
    Homme Profil pro Farid IZEM
    Architecte technique
    Inscrit en
    avril 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Nom : Homme Farid IZEM
    Localisation : France

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : Finance

    Informations forums :
    Inscription : avril 2012
    Messages : 3
    Points : 0
    Points
    0

    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 :
    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 :
    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 :
    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 :
    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 :
    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 :
    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 chevronné
    Homme Profil pro Etienne Mermillod
    Inscrit en
    février 2007
    Messages
    442
    Détails du profil
    Informations personnelles :
    Nom : Homme Etienne Mermillod
    Âge : 29

    Informations forums :
    Inscription : février 2007
    Messages : 442
    Points : 622
    Points
    622

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •