gpt4 book ai didi

hibernate - NHibernate 中 ISession.Save/Update 和 ITransaction.Commit 的区别

转载 作者:行者123 更新时间:2023-12-04 16:24:23 25 4
gpt4 key购买 nike

我有一段代码可以将元素添加到实体集合(一对多关系)。这是带有 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. Save() 将告诉 NHibernate “这个对象应该持久化”。 INSERT 语句发出的确切时间未定义,可能会在一段时间后发生。
  2. 根据级联设置,可能不需要 Save()。
  3. 您应该始终使用交易。
  4. 默认情况下将脏状态刷新到实际数据库发生在事务提交和查询时,如果脏状态可能会影响查询的结果。

情况 1 中发生的情况很可能永远不会触发刷新操作。在情况 2 中,项目可能由于集合上的级联而被保存,而事务提交触发刷新。

关于hibernate - NHibernate 中 ISession.Save/Update 和 ITransaction.Commit 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10817313/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com