2012-02-01 34 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認爲該實體是髒的,因此意外地保存了它。它可能是類似的東西嗎?

相關問題