2012-02-01 99 views
0

我使用NHibernate 3.2NHibernate的尝试,当我做一个选择

我在一个交易,节省了一些东西,和之前commiting,我试图询问一些元素,它抛出我一个插入oracle插入错误。

我的查询(HQL):

MySession = SessionFactory.OpenSession().BeginTransaction(); 
/*Do some saves but don't commit*/ 
var hql = @"select distinct c 
from Car c inner join c.Manufacturer manuf where manuf.Id = 449" 
MySession.CreateQuery(hql).List<Car>(); /*throws error*/ 

当我执行此查询时,它抛出我下面的错误

ORA-01400: cannot insert NULL ... 

我的映射与创建:

lazy="true" dynamic-update="true" dynamic-insert="true" 

会议工厂代码:

private static ISessionFactory _sessionFactory; 

     private static ISessionFactory SessionFactory 
     { 
      get 
      { 
       if (_sessionFactory == null) 
       { 
        var configuration = new Configuration(); 
        configuration.Configure(); 
        configuration.AddAssembly(typeof(EstoqueEquipamento).Assembly); 
        _sessionFactory = configuration.BuildSessionFactory(); 
       } 
       return _sessionFactory; 
      } 
     } 

     public static ISession OpenSession() 
     { 
      return SessionFactory.OpenSession(); 
     } 

谢谢。

+0

你什么时候刷新/提交会话? – Dan 2012-02-01 18:05:52

+0

会在我查询后的那一行,但它从来没有到达那里,因为错误被抛出。 – 2012-02-01 18:06:36

回答

2

NHibernate(FlashMode auto)的默认行为是在执行select时执行刷新 - 这不包括ISqlQueries。所以,当你执行你的hql查询的时候就会发生刷新,实际上flush是在执行hql查询之前发生的。

这可能与错误无关,只是说它试图保存的某个实体在属性中具有NULL值并且DB抱怨。

我要在这里指出,你应该与你的映射

0

我已经由于不一致的映射有过的问题匹配你的数据库的限制,特别是我不得不映射到为空的数据库字段非空能力属性。所以当我检索关联的实体时,默认值被分配给属性,这使得nhibernate认为该实体是脏的,因此意外地保存了它。它可能是类似的东西吗?

相关问题