NHibernate附加UPDATE查询运行

时间:2009-07-21 02:06:59

标签: c# nhibernate

我使用关联表和cascade =“save-update”在两个实体之间定义了多对多关系。

Entity1包含Entity2的列表,相反,Entity2包含Entity1的列表。从这个worflow输出的SQL似乎没问题......

  1. 创建Entity1和Entity2对象
  2. 将Entity2添加到Entity1上的列表
  3. 调用session.Save on Entity1
  4. - >为两个实体运行插入语句,然后将一条记录插入关联表中,将它们链接在一起。

    但是,如果我首先调用session.Save on Entity2,将其添加到List,然后在Entity1上调用session.Save,还有一个额外的UPDATE语句运行,它将所有Entity2的值设置为与开头插入的内容相同。

    虽然没有引起任何问题,但这是一个额外的查询,降低了性能。我玩过逆属性,但这并没有消除额外的更新语句。目前双方都有inverse =“false”,因为我想更新关联表,无论保存哪个实体。

    有什么想法吗?

2 个答案:

答案 0 :(得分:0)

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

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

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

您可能正在获取其他Update语句,因为双方都有inverse = false且第一个实体的关系列表保存为空。 NH只是做了它认为需要的东西,以便更新所有关系。

答案 1 :(得分:0)

感谢您的回复,但我相信我发现了问题。我为每种实现CRUD操作的实体都有一个存储库类。每个CRUD操作都启动它自己的会话/事务,称为Save / Update / etc然后关闭事务/会话。

如果我调用session.Save for Entity2然后session.Save for Entity1(包含Entity2的列表)NH似乎知道它已经在会话中持久存在Entity2,因此不会尝试更新记录。

另一方面,如果我为Entity2调用session.Save然后在单独的会话/事务中调用Entity1的session.Save,它想要再次更新Entity2。我是NH的新手,所以不确定它如何跟踪哪些对象需要更新,但它必须在会话之间重置?

有点让我不错的DDD存储库变得有用了!也许存储库应该使用单例会话或类似的东西来避免这个问题?

谢谢, 约翰