NHibernate中的ISession.Save/Update和ITransaction.Commit之间的区别

时间:2012-05-30 13:28:54

标签: hibernate nhibernate

我有一段代码可以向实体集合添加元素(一对多关系)。这是 ISession.Save

的版本
        using (ISession session = sessionFactory.OpenSession())
        {
            var package = session.QueryOver<Package>().Where(x => x.ID == selectedPackage).SingleOrDefault();
            foreach(var themeId in selectedThemes)
            {
                var selectedTheme = session.QueryOver<HBTheme>().Where(x => x.ID == themeId).SingleOrDefault();
                if (selectedTheme != null)
                {
                    package.Themes.Add(new PackageTheme() { Package = package, Theme = selectedTheme });
                }
            }
            session.Save(package);
        }

那个版本对我不起作用。由于我用 ITransaction 编写了测试版,我将其更改为以下内容:

        using (ISession session = sessionFactory.OpenSession())
        using (ITransaction transaction = session.BeginTransaction())
        {
            var package = session.QueryOver<Package>().Where(x => x.ID == selectedPackage).SingleOrDefault();
            foreach(var themeId in selectedThemes)
            {
                var selectedTheme = session.QueryOver<HBTheme>().Where(x => x.ID == themeId).SingleOrDefault();
                if (selectedTheme != null)
                {
                    package.Themes.Add(new PackageTheme() { Package = package, Theme = selectedTheme });
                }
            }
            transaction.Commit();
        }

现在它有效。 package.Themes 集合中的元素存储在数据库中。怎么会?谢谢!

1 个答案:

答案 0 :(得分:7)

比较苹果和橘子!

  1. Save()会告诉NHibernate“这个对象应该是持久的”。确切地说,发出INSERT语句的时间没有定义,可能会在一段时间后发生。
  2. 根据级联设置,可能不需要保存()。
  3. 您应始终使用交易。
  4. 默认情况下,在事务提交和查询时,将脏状态刷新到实际数据库,如果脏状态可能会影响查询结果。
  5. 在案例1中发生的情况可能是从未触发刷新操作。在案例2中,项目可能由于集合上的级联而被保存,而事务提交会触发刷新。