当前位置: 首页 > 知识库问答 >
问题:

NHibernate一对多映射,有时不拯救儿童

戚晨
2023-03-14

通过nhibernate保存父对象的子对象有时只会导致不在表中插入子对象。这种方法在大多数情况下都有效,但在数千次中,只有几次孩子失踪。

这是一个大型多线程应用程序

以下是子映射:

<class name="Child" table="children" lazy="false" optimistic-lock="all" dynamic-update="true">

<id name="Id" column="id">
  <generator class="native" />
</id>

<many-to-one name="MyParent" class="Parent" column="parent_id" not-null="true"/>
...
...

和儿童班:

public class Child
{
    public long Id { get; set; }
    public Parent MyParent { get; set; }
...
..

父映射:

<id name="Id" column="id">
  <generator class="native" />
</id>

<set name="Children" table="children" cascade="none" lazy="true" inverse="true">
  <key column="parent_id" not-null="true" />
  <one-to-many class="Child" />
</set>
...
...

下面是父类

public class Parent
{
    public long Id { get; set; }
    public ICollection<Child> Children { get; set; }
...
...
..
}

添加父项和子项的代码如下所示:

var theParent = new Parent 
{ 
   ...
}
...
// start the transaction if not begun by the caller
// a few lines later...
Session.Save(theParent);
// Commit transaction only if this method began the transaction...

...

var child = new Child 
{ 
    MyParent = theParent, 
    ...
    ...
}
...
// start the transaction if not begun by the caller
// a few lines later...
Session.Save(child);
// Commit transaction only if this method began the transaction...
// make sure the two-way associations are updated!
if (!child.MyParent.Children.Contains(child))
        child.MyParent.Children.Add(child);
...

检查调用方是否已开始事务的机制似乎没有任何错误,并且调用方在不抛出异常并记录它的情况下不会回滚。我没有发现任何交易被回滚的痕迹。

  1. 父映射中的级联选项有问题吗?
  2. 是因为事务提交发生在父级集合中添加子级之前吗?

在这两种情况下,为什么只有少数情况下孩子失踪。这很难处理,可能会在生产中造成很多问题。发生这种情况的原因可能是什么?

共有1个答案

柴高岑
2023-03-14
  1. 没有。
  2. 没有

我敢打赌,您的事务处理机制有一个缺陷,事务有时根本没有提交。它最终会收集垃圾,导致垃圾被无声地处理和回滚。这发生在会话关闭发生在事务提交之前的情况下。

您可以通过使用相关上下文信息记录事务开始/提交/回滚来跟踪它,以便将开始与提交和回滚匹配。

这可能相当棘手。什么是相关的上下文信息?这在很大程度上取决于应用程序类型。在IIS下的web应用程序中,线程上下文不好,调用上下文不好。在asp的情况下,他们都会迷路。net线程敏捷性切换,在负载下发生。在大多数情况下,只保留HTTP上下文。(注意async wait,其中“callback”配置为在没有任何上下文的情况下运行…)

 类似资料:
  • 我在android应用程序中使用Stripe。目前,客户机服务器用于创建客户和对卡收费。 现在我想在应用程序中保存条带返回的卡信息,并在自定义ui中显示支付方式中添加的卡的列表,以便更新、删除和选择默认卡。 我浏览了stripe的临时密钥文档,他们提供了显示卡细节的活动。但是我找不到如何在自定义ui中显示卡片列表。 有没有其他方法可以实现这一点,例如在本地保存卡信息? 条纹是否允许自定义卡片列表等

  • 问题内容: 我正在努力进行双向多对多映射,其中顺序在一侧很重要,而在另一侧则不重要。 我有两节课:程序和学生。 一个程序有很多学生,顺序很重要。 程序A 约翰 莎莉 赛斯 程式B 亚历克斯 赛斯 艾米 约翰 一个学生有很多程序,但是顺序在这里并不重要。 John 程序A 程序B 莎莉 程序A 赛斯 程序A 程式B 亚历克斯 程式B 艾米 程式B 因此,似乎我可以在程序和学生之间建立双向的多对多关联

  • 本文向大家介绍nhibernate 流利的NHibernate映射,包括了nhibernate 流利的NHibernate映射的使用技巧和注意事项,需要的朋友参考一下 示例 该Fluent NHibernate是一个库,以帮助您在使用C#代码,而不是XML映射的实体映射。Fluent NHibernate使用,fluent pattern并且它基于约定来创建映射,它为Visual Studio工具

  • 有两张数据表,其中A表的某个字段的值指向B表的主键。因为B表的任何一条记录理论上可以对应A表的多条记录,所以称这种 映射为B表对A表数据的一对多映射。 上述结构,如果用 POJO 来表示的话,可以参看下图: 如上图,一个 Master 自然就能对应多个 Pet ,所以, Master.pets (一个 List<Pet>) 就可以指向多个 Pet 对象, 那么我们说 Master.pets 就是

  • 主要内容:@ManyToOne 示例,程序输出结果多对一映射表示实体集合可以与相似实体关联的单值关联。 因此,在关系数据库中,实体的多于一行可以引用另一个实体的相似行。 完整的项目目录结构如下所示 - @ManyToOne 示例 在这个例子中,我们将创建一个学生和图书库之间的多对一关系,多个学生可以发布同一本书。 这个例子包含以下步骤 - 第1步: 在包中创建一个实体类,包含学生ID(s_id)和学生姓名(s_name),其中包含一个包含库类型对

  • 主要内容:@OneToMany 示例,程序输出结果一对多映射进入集合值关联的类别,其中实体与其他实体的集合关联。 因此,在这种类型的关联中,一个实体的实例可以映射到另一个实体的任意数量的实例。 完整的项目目录结构如下所示 - @OneToMany 示例 在这个例子中,我们将创建一个学生和图书库之间的一对多系,这样一个学生能发放多种类型的图书。 这个例子包含以下步骤 - 第1步: 在包下创建一个实体类,它包含学生ID(s_id),学生姓名(s_na