Configuration Spring.net et NHibernate - C#/.NET managed - Programmation
Marsh Posté le 30-04-2008 à 14:50:36
Salut,
si j'ai bien compris l'erreur, il n'existe pas de propriété TransactionManager dans ton Dao.
Si tes DAO implementent bien HibernateDaoSupport, tu devrais plutot setter la propriété HibernateTemplate :
Code :
|
De plus, tu devrais plutot travailler avec des interfaces pour tes DAO au lieu de manipuler directement l'implémtation.
Il y a des exemples fournit avec NHibernate dans Spring.NET, jettes y un oeil.
N'hésites pas à poser des questions sur leur forums:
http://forum.springframework.net
Marsh Posté le 01-05-2008 à 14:05:53
tu sais, tant qu' afaire, utiliser LINQ for SQL plutot qu' NHIBERNATE. Car NHIBERNATE, niveau performance, c'est l'ultra catastrophe.
Marsh Posté le 28-04-2008 à 12:12:08
Bonjour, je n'arrive pas a faire fonctionner les frameworks Spring.net et NHibernate sous Visual Studio 2008.
J'aimerai en plus utiliser les transactions via Spring
Voici mon fichier AppConfig :
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="spring">
<section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
<section name="parsers" type="Spring.Context.Support.NamespaceParsersSectionHandler, Spring.Core" />
</sectionGroup>
<section name="databaseSettings" type="System.Configuration.NameValueSectionHandler, System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
<spring>
<parsers>
<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data" />
</parsers>
<context>
<resource uri="Dao.xml" />
</context>
</spring>
<!-- These properties are referenced in Dao.xml -->
<databaseSettings>
<add key="db.datasource" value="(local);Integrated Security=true" />
<add key="db.user" value="root" />
<add key="db.password" value="root" />
<add key="db.database" value="adecco" />
</databaseSettings>
</configuration>
Voici le fichier DAO.xml :
<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net"
xmlns:db="http://www.springframework.net/database">
<!-- Property placeholder configurer for database settings -->
<object type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core">
<property name="ConfigSections" value="databaseSettings"/>
</object>
<!-- Database and NHibernate Configuration -->
<!-- Attention la valeur du provider "MySql-5.0 doit etre trouve a cette URL http://www.springframework.net/doc-latest/reference/html/dbprovider.html#d0e10929" -->
<db:provider id="DbProvider"
provider="MySql-5.0"
connectionString="Server=localhost;Database=${db.database};User ID=${db.user};Password=${db.password}"/>
<object id="SessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate12">
<property name="DbProvider" ref="DbProvider"/>
<property name="MappingAssemblies">
<list>
<value>adecco</value>
</list>
</property>
<property name="HibernateProperties">
<dictionary>
<entry key="hibernate.connection.provider"
value="NHibernate.Connection.DriverConnectionProvider"/>
<entry key="hibernate.dialect"
value="NHibernate.Dialect.MySQL5Dialect"/>
<entry key="hibernate.connection.driver_class"
value="NHibernate.Driver.MySqlDataDriver"/>
<!-- Mise en place du cache -->
<entry key="hibernate.cache.provider_class"
value="NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache" />
<entry key="relativeExpiration"
value="60" />
<entry key="hibernate.cache.use_query_cache"
value="true" />
<entry key="hibernate.current_session_context_class"
value="Spring.Data.NHibernate.SpringSessionContext, Spring.Data.NHibernate12"/>
</dictionary>
</property>
</object>
<!-- Pour la gestion des transaction avec NHibernate et Spring -->
<object id="HibernateTransactionManager"
type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate12">
<property name="DbProvider" ref="DbProvider"/>
<property name="SessionFactory" ref="SessionFactory"/>
</object>
<!-- Mise en place d'un proxy pour les transactions
<object id="TxProxyConfigurationTemplate" abstract="true"
type="Spring.Transaction.Interceptor.TransactionProxyFactoryObject, Spring.Data">
<property name="PlatformTransactionManager" ref="HibernateTransactionManager"/>
<property name="TransactionAttributes">
<name-values>
<add key="Process*" value="PROPAGATION_REQUIRED"/>
</name-values>
</property>
</object> -->
<object id="HibernateTemplate" type="Spring.Data.NHibernate.HibernateTemplate">
<property name="SessionFactory" ref="SessionFactory" />
<property name="TemplateFlushMode" value="Auto" />
<property name="CacheQueries" value="true" />
</object>
<object id="QualificationDAO" type="adecco.DAO.QualificationDAO, adecco">
<property name="SessionFactory" ref="SessionFactory"/>
<property name="TransactionManager" ref="HibernateTransactionManager"/>
</object>
<!-- Data Access Objects
<object id="ClientDAO" type="adecco.DAO.ClientDao, adecco.DAO">
<property name="SessionFactory" ref="SessionFactory"/>
<property name="TransactionManager" ref="HibernateTransactionManager"/>
</object>
<object id="ContratDAO" type="adecco.DAO.ContratDao, adecco.DAO">
<property name="SessionFactory" ref="SessionFactory"/>
<property name="TransactionManager" ref="HibernateTransactionManager"/>
</object>
<object id="InterimaireDAO" type="adecco.DAO.InterimaireDao, adecco.DAO">
<property name="SessionFactory" ref="SessionFactory"/>
<property name="TransactionManager" ref="HibernateTransactionManager"/>
</object>
<object id="QualificationDAO" type="adecco.DAO.Qualification, adecco.DAO">
<property name="SessionFactory" ref="SessionFactory"/>
<property name="TransactionManager" ref="HibernateTransactionManager"/>
</object>
<object id="RaisonSocialDAO" type="adecco.DAO.RaisonSocialDao, adecco.DAO">
<property name="SessionFactory" ref="SessionFactory"/>
<property name="TransactionManager" ref="HibernateTransactionManager"/>
</object>
<object id="RoutagePaieDAO" type="adecco.DAO.RoutagePaieDao, adecco.DAO">
<property name="SessionFactory" ref="SessionFactory"/>
<property name="TransactionManager" ref="HibernateTransactionManager"/>
</object>
<object id="SecteurActiviteDAO" type="adecco.DAO.SecteurActiviteDao, adecco.DAO">
<property name="SessionFactory" ref="SessionFactory"/>
<property name="TransactionManager" ref="HibernateTransactionManager"/>
</object>
<object id="StatutContratDAO" type="adecco.DAO.StatutContratDao, adecco.DAO">
<property name="SessionFactory" ref="SessionFactory"/>
<property name="TransactionManager" ref="HibernateTransactionManager"/>
</object>
<object id="TypeAvenantDAO" type="adecco.DAO.TypeAvenantDao, adecco.DAO">
<property name="SessionFactory" ref="SessionFactory"/>
<property name="TransactionManager" ref="HibernateTransactionManager"/>
</object> -->
</objects>
Voici, le main :
Sachant que ma classe QualificationDAO ne fait rien pour l'instant donc je ne l'a publie pas.
Voici le message d'erreur :
System.Configuration.ConfigurationErrorsException: Error creating context 'sprin
g.root': 'TransactionManager' node cannot be resolved for the specified context
[adecco.DAO.QualificationDAO]. ---> Spring.Util.FatalReflectionException: Cannot
instantiate Type [Spring.Context.Support.XmlApplicationContext] using ctor [Voi
d .ctor(System.String, Boolean, System.String[])] : 'Une exception a été levée p
ar la cible d'un appel.' ---> System.Reflection.TargetInvocationException: Une e
xception a été levée par la cible d'un appel. ---> Spring.Objects.Factory.Object
CreationException: Error creating object with name 'QualificationDAO' defined in
'file [D:\Mes Documents\Visual Studio 2008\Projects\adecco\adecco\bin\Debug\Dao
.xml]' : Initialization of object failed : 'TransactionManager' node cannot be r
esolved for the specified context [adecco.DAO.QualificationDAO]. ---> Spring.Cor
e.InvalidPropertyException: 'TransactionManager' node cannot be resolved for the
specified context [adecco.DAO.QualificationDAO].
à Spring.Expressions.PropertyOrFieldNode.InitializeNode(Object context)
à Spring.Expressions.PropertyOrFieldNode.Set(Object context, EvaluationContex
t evalContext, Object newValue)
à Spring.Expressions.BaseNode.SetValue(Object context, IDictionary variables,
Object newValue)
à Spring.Expressions.BaseNode.Spring.Expressions.IExpression.SetValue(Object
context, Object newValue)
à Spring.Objects.ObjectWrapper.SetPropertyValue(IExpression propertyExpressio
n, Object val)
à Spring.Objects.ObjectWrapper.SetPropertyValue(PropertyValue pv)
à Spring.Objects.ObjectWrapper.SetPropertyValues(IPropertyValues propertyValu
es, Boolean ignoreUnknown)
à Spring.Objects.ObjectWrapper.SetPropertyValues(IPropertyValues pvs)
à Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.ApplyPr
opertyValues(String name, RootObjectDefinition definition, IObjectWrapper wrappe
r, IPropertyValues properties)
à Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.Populat
eObject(String name, RootObjectDefinition definition, IObjectWrapper wrapper)
à Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.Configu
reObject(String name, RootObjectDefinition definition, IObjectWrapper wrapper)
à Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.CreateO
bject(String name, RootObjectDefinition definition, Object[] arguments, Boolean
allowEagerCaching)
--- Fin de la trace de la pile d'exception interne ---
à Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.CreateO
bject(String name, RootObjectDefinition definition, Object[] arguments, Boolean
allowEagerCaching)
à Spring.Objects.Factory.Support.AbstractAutowireCapableObjectFactory.CreateO
bject(String name, RootObjectDefinition definition, Object[] arguments)
à Spring.Objects.Factory.Support.AbstractObjectFactory.CreateAndCacheSingleto
nInstance(String objectName, RootObjectDefinition objectDefinition, Object[] arg
uments)
à Spring.Objects.Factory.Support.AbstractObjectFactory.GetObject(String name,
Type requiredType, Object[] arguments)
à Spring.Objects.Factory.Support.AbstractObjectFactory.GetObject(String name)
à Spring.Objects.Factory.Support.DefaultListableObjectFactory.PreInstantiateS
ingletons()
à Spring.Context.Support.AbstractApplicationContext.Refresh()
à Spring.Context.Support.XmlApplicationContext..ctor(Boolean refresh, String
name, Boolean caseSensitive, IApplicationContext parentContext, String[] configu
rationLocations)
à Spring.Context.Support.XmlApplicationContext..ctor(String name, Boolean cas
eSensitive, String[] configurationLocations)
--- Fin de la trace de la pile d'exception interne ---
à System.RuntimeMethodHandle._InvokeConstructor(Object[] args, SignatureStruc
t& signature, IntPtr declaringType)
à System.RuntimeMethodHandle.InvokeConstructor(Object[] args, SignatureStruct
signature, RuntimeTypeHandle declaringType)
à System.Reflection.RuntimeConstructorInfo.Invoke(BindingFlags invokeAttr, Bi
nder binder, Object[] parameters, CultureInfo culture)
à System.Reflection.ConstructorInfo.Invoke(Object[] parameters)
à Spring.Util.ObjectUtils.InstantiateType(ConstructorInfo constructor, Object
[] arguments)
--- Fin de la trace de la pile d'exception interne ---
à Spring.Util.ObjectUtils.InstantiateType(ConstructorInfo constructor, Object
[] arguments)
à Spring.Context.Support.ContextHandler.RootContextInstantiator.InvokeContext
Constructor(ConstructorInfo ctor)
à Spring.Context.Support.ContextHandler.ContextInstantiator.InstantiateContex
t()
à Spring.Context.Support.ContextHandler.InstantiateContext(IApplicationContex
t parentContext, Object configContext, String contextName, Type contextType, Boo
lean caseSensitive, String[] resources)
à Spring.Context.Support.ContextHandler.Create(Object parent, Object configCo
ntext, XmlNode section)
--- Fin de la trace de la pile d'exception interne ---
à System.Configuration.BaseConfigurationRecord.EvaluateOne(String[] keys, Sec
tionInput input, Boolean isTrusted, FactoryRecord factoryRecord, SectionRecord s
ectionRecord, Object parentResult)
à System.Configuration.BaseConfigurationRecord.Evaluate(FactoryRecord factory
Record, SectionRecord sectionRecord, Object parentResult, Boolean getLkg, Boolea
n getRuntimeObject, Object& result, Object& resultRuntimeObject)
à System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String con
figKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boole
an requestIsHere, Object& result, Object& resultRuntimeObject)
à System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String con
figKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boole
an requestIsHere, Object& result, Object& resultRuntimeObject)
à System.Configuration.BaseConfigurationRecord.GetSectionRecursive(String con
figKey, Boolean getLkg, Boolean checkPermission, Boolean getRuntimeObject, Boole
an requestIsHere, Object& result, Object& resultRuntimeObject)
à System.Configuration.BaseConfigurationRecord.GetSection(String configKey, B
oolean getLkg, Boolean checkPermission)
à System.Configuration.BaseConfigurationRecord.GetSection(String configKey)
à System.Configuration.ClientConfigurationSystem.System.Configuration.Interna
l.IInternalConfigSystem.GetSection(String sectionName)
à System.Configuration.ConfigurationManager.GetSection(String sectionName)
à Spring.Util.ConfigurationUtils.GetSection(String sectionName)
à Spring.Context.Support.ContextRegistry.InitializeContextIfNeeded()
à Spring.Context.Support.ContextRegistry.GetContext()
à adecco.Program.Main(String[] args) dans D:\Mes Documents\Visual Studio 2008
\Projects\adecco\adecco\Program.cs:ligne 22
Je ne comprend vraiment pas ce qui bug. Apparemment, il n'aime pas l'objet 'TransactionManager'.
Si quelqu'un peut m'aider, ce serai sympa.
Mais c vrai que j'en suis à mon 6ème msg sur plusieurs sujet différent sans aucune réponse. A croire que personne ne configure de framework en France.
Cordialement...