cheachwood
08-30-2007, 02:29 PM
Hi,
I am trying to use the Transaction Attribute with NHibernate and Generics, here are part of my code :
for a DAO.xml file :
<!-- Récupère les propriétés de la BD définis dans le fichier de configuration principal -->
<object type="Spring.Objects.Factory.Config.PropertyPlaceholderC onfigurer, Spring.Core">
<property name="ConfigSections" value="databaseSettings"/>
</object>
<!-- Configuration de la BD et de NHibernate -->
<db:provider id="DbProvider"
provider="SqlServer-2.0"
connectionString="Integrated Security=false; Data Source=${db.datasource};Database=${db.database};Us er ID=${db.user};Password=${db.password};"/>
<object id="HibernateTransactionManager" type="Spring.Data.NHibernate.HibernateTransactionManager , Spring.Data.NHibernate12">
<property name="DbProvider" ref="DbProvider"/>
<property name="SessionFactory" ref ="SessionFactory"/>
</object>
<import resource ="~/Config/DeclarativeServicesAttributeDriven.xml"/>
<!-- Configuration d'une session NHibernate -->
<object id="SessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate12">
<property name="DbProvider" ref="DbProvider"/>
<property name="MappingAssemblies">
<list>
<value>Cleos2008.DAL</value>
</list>
</property>
<property name="HibernateProperties">
<dictionary>
<entry key="hibernate.connection.provider"
value="NHibernate.Connection.DriverConnectionProvider"/>
<entry key="hibernate.dialect"
value="NHibernate.Dialect.MsSql2005Dialect"/>
<entry key="hibernate.connection.driver_class"
value="NHibernate.Driver.SqlClientDriver"/>
</dictionary>
</property>
</object>
<!-- Définition du template Hibernate qui sera utilisé par les objets DAO-->
<object id="HibernateTemplate" type="Spring.Data.NHibernate.Generic.HibernateTemplate, Spring.Data.NHibernate12">
<property name="SessionFactory" ref="SessionFactory" />
<property name="TemplateFlushMode" value="Auto" />
<property name="CacheQueries" value="true" />
</object>
<!-- Data Access Objects -->
<object id="referentielDAO" type="Cleos2008.DAL.NHibernate.Aide.NHibernateReferentie lDAO, Cleos2008.DAL">
<property name="HibernateTemplate" ref="HibernateTemplate"/>
</object>
from a App.xml file :
<!-- Récupère les propriétés de la BD définis dans le fichier de configuration principal -->
<object type="Spring.Objects.Factory.Config.PropertyPlaceholderC onfigurer, Spring.Core">
<property name="ConfigSections" value="databaseSettings"/>
</object>
<!-- Configuration de la BD et de NHibernate -->
<db:provider id="DbProvider"
provider="SqlServer-2.0"
connectionString="Integrated Security=false; Data Source=${db.datasource};Database=${db.database};Us er ID=${db.user};Password=${db.password};"/>
<object id="HibernateTransactionManager" type="Spring.Data.NHibernate.HibernateTransactionManager , Spring.Data.NHibernate12">
<property name="DbProvider" ref="DbProvider"/>
<property name="SessionFactory" ref ="SessionFactory"/>
</object>
<import resource ="~/Config/DeclarativeServicesAttributeDriven.xml"/>
<!-- Configuration d'une session NHibernate -->
<object id="SessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate12">
<property name="DbProvider" ref="DbProvider"/>
<property name="MappingAssemblies">
<list>
<value>Cleos2008.DAL</value>
</list>
</property>
<property name="HibernateProperties">
<dictionary>
<entry key="hibernate.connection.provider"
value="NHibernate.Connection.DriverConnectionProvider"/>
<entry key="hibernate.dialect"
value="NHibernate.Dialect.MsSql2005Dialect"/>
<entry key="hibernate.connection.driver_class"
value="NHibernate.Driver.SqlClientDriver"/>
</dictionary>
</property>
</object>
<!-- Définition du template Hibernate qui sera utilisé par les objets DAO-->
<object id="HibernateTemplate" type="Spring.Data.NHibernate.Generic.HibernateTemplate, Spring.Data.NHibernate12">
<property name="SessionFactory" ref="SessionFactory" />
<property name="TemplateFlushMode" value="Auto" />
<property name="CacheQueries" value="true" />
</object>
<!-- Data Access Objects -->
<object id="referentielDAO" type="Cleos2008.DAL.NHibernate.Aide.NHibernateReferentie lDAO, Cleos2008.DAL">
<property name="HibernateTemplate" ref="HibernateTemplate"/>
</object>
from a NHibernateObjectDomaineDAO.cs file
public abstract class NHibernateObjectDomaineDAO<T,idT>:HibernateDaoSupport, IObjectDomaineDAO<T,idT>
{
#region IObjectDomaineDAO<T> Membres
/// <summary>
/// Permet de faire persister un objet
/// </summary>
/// <param name="instance">Une instance du type �* persister</param>
/// <returns>Un objet du type générique</returns>
public T Save(T instance)
{
HibernateTemplate.Save(instance);
return instance;
}
from a NHibernateReferentielDAO.cs file :
public class NHibernateReferentielDAO : NHibernateObjectDomaineDAO<Referentiel, string>, IReferentielDAO<Referentiel, string>
{
}
and from a RulesReferentiel.cs file
public class RulesReferentiel : IReferentielServices<Referentiel, string>
{
private IReferentielDAO<Referentiel, string> referentielDAO;
public IReferentielDAO<Referentiel, string> ReferentielDAO
{
get { return referentielDAO; }
set { referentielDAO = value; }
}
#region IObjectServices<Referentiel,string> Membres
[LoggingAttribute("cheachwood")]
[Transaction(ReadOnly = false)]
public Referentiel Save(Referentiel instance)
{
return ReferentielDAO.Save(instance);
}
Well when I launch the application I have the exception :
Error creating context 'spring.root': Error creating object with name 'referentielDAO' defined in 'file [C:\Documents and Settings\jmartin\Mes documents\Visual Studio 2005\Projects\Cleos2008\Cleos2008.UI\bin\Debug\Con fig\DAO.xml]' : Error setting property values: PropertyAccessExceptionsException (1 errors); nested PropertyAccessExceptions are:
[Spring.Core.TypeMismatchException: Cannot convert property value of type [CompositionAopProxy_fb0bb1772abc4da4ae59c7a6ac4925 bf] to required type [Spring.Data.NHibernate.Generic.HibernateTemplate] for property 'HibernateTemplate'., Inner Exception: Spring.Core.TypeMismatchException: Cannot convert property value of type [CompositionAopProxy_fb0bb1772abc4da4ae59c7a6ac4925 bf] to required type [Spring.Data.NHibernate.Generic.HibernateTemplate] for property 'HibernateTemplate'.
Spring.Core.TypeConversion.TypeConversionUtils.Con vertValueIfNecessary(Type requiredType, Object newValue, String propertyName)]
I don't understand why, I verified all the assembly dependencies all seems to be good. Someone have an idea?
Cheachwwood
I am trying to use the Transaction Attribute with NHibernate and Generics, here are part of my code :
for a DAO.xml file :
<!-- Récupère les propriétés de la BD définis dans le fichier de configuration principal -->
<object type="Spring.Objects.Factory.Config.PropertyPlaceholderC onfigurer, Spring.Core">
<property name="ConfigSections" value="databaseSettings"/>
</object>
<!-- Configuration de la BD et de NHibernate -->
<db:provider id="DbProvider"
provider="SqlServer-2.0"
connectionString="Integrated Security=false; Data Source=${db.datasource};Database=${db.database};Us er ID=${db.user};Password=${db.password};"/>
<object id="HibernateTransactionManager" type="Spring.Data.NHibernate.HibernateTransactionManager , Spring.Data.NHibernate12">
<property name="DbProvider" ref="DbProvider"/>
<property name="SessionFactory" ref ="SessionFactory"/>
</object>
<import resource ="~/Config/DeclarativeServicesAttributeDriven.xml"/>
<!-- Configuration d'une session NHibernate -->
<object id="SessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate12">
<property name="DbProvider" ref="DbProvider"/>
<property name="MappingAssemblies">
<list>
<value>Cleos2008.DAL</value>
</list>
</property>
<property name="HibernateProperties">
<dictionary>
<entry key="hibernate.connection.provider"
value="NHibernate.Connection.DriverConnectionProvider"/>
<entry key="hibernate.dialect"
value="NHibernate.Dialect.MsSql2005Dialect"/>
<entry key="hibernate.connection.driver_class"
value="NHibernate.Driver.SqlClientDriver"/>
</dictionary>
</property>
</object>
<!-- Définition du template Hibernate qui sera utilisé par les objets DAO-->
<object id="HibernateTemplate" type="Spring.Data.NHibernate.Generic.HibernateTemplate, Spring.Data.NHibernate12">
<property name="SessionFactory" ref="SessionFactory" />
<property name="TemplateFlushMode" value="Auto" />
<property name="CacheQueries" value="true" />
</object>
<!-- Data Access Objects -->
<object id="referentielDAO" type="Cleos2008.DAL.NHibernate.Aide.NHibernateReferentie lDAO, Cleos2008.DAL">
<property name="HibernateTemplate" ref="HibernateTemplate"/>
</object>
from a App.xml file :
<!-- Récupère les propriétés de la BD définis dans le fichier de configuration principal -->
<object type="Spring.Objects.Factory.Config.PropertyPlaceholderC onfigurer, Spring.Core">
<property name="ConfigSections" value="databaseSettings"/>
</object>
<!-- Configuration de la BD et de NHibernate -->
<db:provider id="DbProvider"
provider="SqlServer-2.0"
connectionString="Integrated Security=false; Data Source=${db.datasource};Database=${db.database};Us er ID=${db.user};Password=${db.password};"/>
<object id="HibernateTransactionManager" type="Spring.Data.NHibernate.HibernateTransactionManager , Spring.Data.NHibernate12">
<property name="DbProvider" ref="DbProvider"/>
<property name="SessionFactory" ref ="SessionFactory"/>
</object>
<import resource ="~/Config/DeclarativeServicesAttributeDriven.xml"/>
<!-- Configuration d'une session NHibernate -->
<object id="SessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate12">
<property name="DbProvider" ref="DbProvider"/>
<property name="MappingAssemblies">
<list>
<value>Cleos2008.DAL</value>
</list>
</property>
<property name="HibernateProperties">
<dictionary>
<entry key="hibernate.connection.provider"
value="NHibernate.Connection.DriverConnectionProvider"/>
<entry key="hibernate.dialect"
value="NHibernate.Dialect.MsSql2005Dialect"/>
<entry key="hibernate.connection.driver_class"
value="NHibernate.Driver.SqlClientDriver"/>
</dictionary>
</property>
</object>
<!-- Définition du template Hibernate qui sera utilisé par les objets DAO-->
<object id="HibernateTemplate" type="Spring.Data.NHibernate.Generic.HibernateTemplate, Spring.Data.NHibernate12">
<property name="SessionFactory" ref="SessionFactory" />
<property name="TemplateFlushMode" value="Auto" />
<property name="CacheQueries" value="true" />
</object>
<!-- Data Access Objects -->
<object id="referentielDAO" type="Cleos2008.DAL.NHibernate.Aide.NHibernateReferentie lDAO, Cleos2008.DAL">
<property name="HibernateTemplate" ref="HibernateTemplate"/>
</object>
from a NHibernateObjectDomaineDAO.cs file
public abstract class NHibernateObjectDomaineDAO<T,idT>:HibernateDaoSupport, IObjectDomaineDAO<T,idT>
{
#region IObjectDomaineDAO<T> Membres
/// <summary>
/// Permet de faire persister un objet
/// </summary>
/// <param name="instance">Une instance du type �* persister</param>
/// <returns>Un objet du type générique</returns>
public T Save(T instance)
{
HibernateTemplate.Save(instance);
return instance;
}
from a NHibernateReferentielDAO.cs file :
public class NHibernateReferentielDAO : NHibernateObjectDomaineDAO<Referentiel, string>, IReferentielDAO<Referentiel, string>
{
}
and from a RulesReferentiel.cs file
public class RulesReferentiel : IReferentielServices<Referentiel, string>
{
private IReferentielDAO<Referentiel, string> referentielDAO;
public IReferentielDAO<Referentiel, string> ReferentielDAO
{
get { return referentielDAO; }
set { referentielDAO = value; }
}
#region IObjectServices<Referentiel,string> Membres
[LoggingAttribute("cheachwood")]
[Transaction(ReadOnly = false)]
public Referentiel Save(Referentiel instance)
{
return ReferentielDAO.Save(instance);
}
Well when I launch the application I have the exception :
Error creating context 'spring.root': Error creating object with name 'referentielDAO' defined in 'file [C:\Documents and Settings\jmartin\Mes documents\Visual Studio 2005\Projects\Cleos2008\Cleos2008.UI\bin\Debug\Con fig\DAO.xml]' : Error setting property values: PropertyAccessExceptionsException (1 errors); nested PropertyAccessExceptions are:
[Spring.Core.TypeMismatchException: Cannot convert property value of type [CompositionAopProxy_fb0bb1772abc4da4ae59c7a6ac4925 bf] to required type [Spring.Data.NHibernate.Generic.HibernateTemplate] for property 'HibernateTemplate'., Inner Exception: Spring.Core.TypeMismatchException: Cannot convert property value of type [CompositionAopProxy_fb0bb1772abc4da4ae59c7a6ac4925 bf] to required type [Spring.Data.NHibernate.Generic.HibernateTemplate] for property 'HibernateTemplate'.
Spring.Core.TypeConversion.TypeConversionUtils.Con vertValueIfNecessary(Type requiredType, Object newValue, String propertyName)]
I don't understand why, I verified all the assembly dependencies all seems to be good. Someone have an idea?
Cheachwwood