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