0

我有以下场景:在运行时创建了两个“父”实体。它们中的每一个都引用一个“共享”子实体。

这是一些伪代码:

public class Parent
{
    public Parent(Child child)
    {...}
    public Child { get; }
}

Child child = new Child();
Parent mother = new Parent(child)
Parent father = new Parent(child)

我希望能够从不同的会话和事务中独立并可能在单独的线程上保存母亲和父亲实例。

如何使用 NH 处理子实体的保存?

好的,有 18 次观看,没有评论……我想我需要补充一些说明。

我的映射定义当 Parent 被持久化时 Child 应该被自动持久化。

子实体会发生什么

session.Save(father)

在一个线程上调用并且

session.Save(mother)

在不同的线程上?

4

1 回答 1

0

从评论看来,孩子只需要作为参考,它被保存session.Load<Child>(knownChildId)在每个线程中使用。这将为同一个对象创建 2 个不同的代理。

如果孩子尚未保存并且设置了级联,则可能存在潜在的竞争条件,并且

  • 在创建处理父母的线程之前保存共享的孩子
  • lock(child)session.Save(father);
  • 对 Child 中的业务键引入唯一约束并在线程上处理 DuplicateKeyException
于 2012-12-11T20:02:41.440 回答