2013-02-08 24 views
3

我遵循spring.net文档和northwind示例。Spring.net Nhibernate dao为空

BereikDao

[Repository] 
public class BereikDao : HibernateDao, IBereikDao 
{ 
    [Transaction(ReadOnly = true)] 
    public model.Bereik getById(int id) 
    { 
     return CurrentSession.Get<Bereik>(id); 
    } 

    [Transaction(ReadOnly = true)] 
    public IList<Bereik> getAll() 
    { 
     return getAll<Bereik>(); 
    } 
} 

的HibernateDAO

public abstract class HibernateDao 
{ 
    private ISessionFactory sessionFactory; 

    /// <summary> 
    /// Session factory for sub-classes. 
    /// </summary> 
    public ISessionFactory SessionFactory 
    { 
     protected get { return sessionFactory; } 
     set { sessionFactory = value; } 
    } 

    /// <summary> 
    /// Get's the current active session. Will retrieve session as managed by the 
    /// Open Session In View module if enabled. 
    /// </summary> 
    protected ISession CurrentSession 
    { 
     get { return sessionFactory.GetCurrentSession(); } 
    } 

    protected IList<T> getAll<T>() where T : class 
    { 
     ICriteria criteria = CurrentSession.CreateCriteria<T>(); 
     return criteria.List<T>(); 
    } 
} 

弹簧dao.xml

<objects xmlns="http://www.springframework.net" 
     xmlns:db="http://www.springframework.net/database" 
     xmlns:tx="http://www.springframework.net/tx"> 
    <db:provider id="DbProvider" 
         provider="IfxOdbc" connectionString="Dsn=${db.dsn};Host=${db.host};Server=${db.server};Service=${db.service};Database=${db.database};UID=${db.user};Password=${db.password};"/> 
    <object id="appConfigPropertyHolder" 
     type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core"> 
    <property name="configSections" value="databaseSettings"/> 
     </object> 
     <object id="NHibernateSessionFactory" type="Demo.dao.CustomLocalSessionFactoryObject"> 
     <property name="DbProvider" ref="DbProvider"/> 
     <property name="MappingAssemblies"> 
      <list> 
      <value>Demo</value> 
      </list> 
     </property> 
     <property name="HibernateProperties"> 
      <dictionary> 
      <entry key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/> 
      <entry key="dialect" value="NHibernate.Dialect.InformixDialect1000"/> 
      <entry key="connection.driver_class" value="NHibernate.Driver.IfxDriver"/> 
      <entry key="show_sql" value="true" /> 
      </dictionary> 
     </property> 


    <property name="ExposeTransactionAwareSessionFactory" value="true" /> 


    </object> 

    <object id="transactionManager" 
     type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate33"> 
    <property name="DbProvider" ref="DbProvider"/> 
    <property name="SessionFactory" ref="NHibernateSessionFactory"/> 
    </object> 

    <object type="Spring.Dao.Attributes.PersistenceExceptionTranslationPostProcessor, Spring.Data"/> 

    <object id="bereikDao" type="Demo.dao.BereikDao"> 
    <property name="SessionFactory" ref="NHibernateSessionFactory"/> 
    </object> 

    <object id="bereikService" type="Demo.service.impl.BereikService"> 
    <property name="bereikDao" ref="bereikDao"/> 
    </object> 

    <tx:attribute-driven transaction-manager="transactionManager" proxy-target-type="true"/> 


</objects> 

BereikService

public class BereikService : IBereikService 
{ 
    private IBereikDao _bereikDao; 

    public IBereikDao bereikDao 
    { 
     get { return _bereikDao; } 
     set { _bereikDao = value; } 
    } 

    [Transaction] 
    public IList<model.Bereik> getAll() 
    { 

     return _bereikDao.getAll(); 
    } 
} 

而且在我的应用程序:

bereikService = (BereikService)ctx.GetObject("bereikService"); 
IList<Bereik> bereiken = bereikService.getAll(); 

当bereikService调试bereikDao为空。

突然以下错误:

'Errors' node cannot be resolved for the specified context [System.InvalidCastException: Kan een object van het type System.Data.Odbc.OdbcConnection niet converteren naar het type IBM.Data.Informix.IfxConnection. 
    bij IBM.Data.Informix.IfxCommand.System.Data.IDbCommand.set_Connection(IDbConnection value) 
    bij NHibernate.AdoNet.AbstractBatcher.Prepare(IDbCommand cmd) in p:\nhibernate-core\src\NHibernate\AdoNet\AbstractBatcher.cs:regel 112 
    bij NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd) in p:\nhibernate-core\src\NHibernate\AdoNet\AbstractBatcher.cs:regel 217 
    bij NHibernate.Loader.Loader.GetResultSet(IDbCommand st, Boolean autoDiscoverTypes, Boolean callable, RowSelection selection, ISessionImplementor session) in p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:regel 1226 
    bij NHibernate.Loader.Loader.DoQuery(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:regel 421 
    bij NHibernate.Loader.Loader.DoQueryAndInitializeNonLazyCollections(ISessionImplementor session, QueryParameters queryParameters, Boolean returnProxies) in p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:regel 251 
    bij NHibernate.Loader.Loader.DoList(ISessionImplementor session, QueryParameters queryParameters) in p:\nhibernate-core\src\NHibernate\Loader\Loader.cs:regel 1564]. 

翻译:无法转换System.Data.Odbc.OdbcConnection的对象IBM.Data.Informix.IfxConnection。 Nhibernate错误?

从调试:

Spring.Data.NHibernate.HibernateTransactionManager - Exposing Hibernate transaction as ADO transaction [System.Data.Odbc.OdbcConnection] 
+0

如果你做了'var myDao =(IBereikDao)ctx.GetObject(“bereikDao”);'? – Marijn

+0

附加信息:简体中文对象面包车类型DecoratorAopProxy_493459a5f40e441ba75921dbae1516e4 niet converteren naar het type Demo.dao.BereikDao。 – Alexander

+1

看起来像您试图将aop代理(为事务支持创建)转换为具体类型。确定你没有做'(BereikDao)ctx.GetObject(“bereikDao”);'(看演员)? var obj = ctx.GetObject(“bereikDao”)'做了什么? En het is be om om je stacktraces in het Engels te geven - er zijn veel minder mensen die Nederlands kunnen lezen :) – Marijn

回答

0

让我知道如果你仍然得到错误后您不要这样做。

开始与添加的对象引用Dao.XML并将其绑定到了一个SessionFactory如下:

<object id="BereikDao" type="Spring.Northwind.Dao.NHibernate.HibernateBereikDao,  Spring.Northwind.Dao.NHibernate"> 
<property name="SessionFactory" ref="NHibernateSessionFactory"/> 
</object> 

你还必须为对象引用它添加到service.xml中并结合BereikDao如下:

<object id="BereikService" type="Spring.Northwind.Service.BereikService, Spring.Northwind.Service"> 
<property name="BereikDao" ref="BereikDao"/> 
</object> 
+0

对于最近的回复,我表示歉意。 我无法测试它,因为我仍然有这个错误:无法转换对象的System.Data.Odbc.OdbcConnection – Alexander

相关问题