代码之家  ›  专栏  ›  技术社区  ›  John

NHibernate附加UPDATE查询运行

  •  0
  • John  · 技术社区  · 16 年前

    Entity1包含Entity2的列表,反之,Entity2包含Entity1的列表。此工作流输出的SQL似乎正常。。。

    1. 创建Entity1和Entity2对象
    2. 将Entity2添加到Entity1的列表中

    ->对这两个实体运行插入语句,然后将一条记录插入到将它们链接在一起的关联表中。

    然而,如果我

    2 回复  |  直到 16 年前
        1
  •  0
  •   Brendan Kowitz    16 年前

    从文档中: inverse(可选-默认为false):如果启用,Hibernate将不会尝试插入或更新此连接定义的属性。

    我的建议:在某些情况下,为了防止使用双向连接进行额外的更新,可能需要更新两个集合:

    Contact c;
    Address a;    
    c.Addresses.Add(a);
    a.Contacts.Add(c);
    

    您可能会收到额外的Update语句,因为双方都有inverse=false,并且第一个实体的关系列表保存为空。NH只是在做它认为需要做的事情,以更新所有关系。

        2
  •  0
  •   John    16 年前

    谢谢你的回复,但我相信我已经找到了问题所在。我为实现CRUD操作的每种类型的实体都有一个存储库类。每个CRUD操作都会启动自己的会话/事务,称为Save/Update/etc,然后关闭事务/会话。

    如果我召开会议。先保存Entity2,然后保存会话。除了Entity1(包含Entity2的列表)之外,NH似乎知道它已经在会话中持久化了Entity2,因此不会尝试更新记录。

    另一方面,如果我召开会议。先保存Entity2,然后保存会话。在单独的会话/事务中保存Entity1,它希望再次更新Entity2。我是NH的新手,所以不确定它如何跟踪哪些对象需要更新,但它必须在会话之间重置?

    不过,有点让我漂亮的DDD存储库没那么有用了!也许存储库应该使用单例会话或类似的东西来避免这个问题?

    谢谢, 约翰