【问题标题】:NHibernate tries to insert when I do a selectNHibernate 在我进行选择时尝试插入
【发布时间】:2012-02-01 17:58:26
【问题描述】:

我正在使用 NHibernate 3.2

我正在进行事务,保存一些东西,在提交之前,我试图查询一些元素,这会引发 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();
        }

谢谢。

【问题讨论】:

  • 什么时候刷新/提交会话?
  • 将是我查询之后的行,但由于引发错误,它永远不会到达那里。

标签: c# oracle nhibernate hql


【解决方案1】:

NHibernate (FlashMode auto) 的默认行为是在执行选择时执行刷新 - 这不包括 ISqlQueries。因此,在您执行 hql 查询的那一刻,刷新发生,实际上刷新发生在 hql 查询执行之前。

这可能与错误无关,它仅表示它尝试保存的实体之一在属性中具有 NULL 值并且数据库抱怨。

我应该在这里指出,您可能应该将您的数据库约束与您的映射相匹配

【讨论】:

    【解决方案2】:

    由于映射不一致,我之前遇到过问题,特别是我有一个不可为空的属性映射到一个可以为空的数据库字段。因此,当我检索关联实体时,为该属性分配了一个默认值,这使 nhibernate 认为该实体很脏,因此它意外地保存了它。会不会是类似的东西?

    【讨论】:

      猜你喜欢
      • 2013-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-11
      • 1970-01-01
      相关资源
      最近更新 更多