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 :
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
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>
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 <?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>
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 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 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
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 }
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 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"); }
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
Partager